Wenn ein Listenindex vorhanden ist, führen Sie X aus

128

In meinem Programm gibt der Benutzer die Nummer nund dann die nAnzahl der Zeichenfolgen ein, die in einer Liste gespeichert werden.

Ich muss so codieren, dass, wenn ein bestimmter Listenindex vorhanden ist, eine Funktion ausgeführt wird.

Dies wird durch die Tatsache komplizierter, dass ich if-Aussagen über verschachtelt habe len(my_list).

Hier ist eine vereinfachte Version von dem, was ich jetzt habe, was nicht funktioniert:

n = input ("Define number of actors: ")

count = 0

nams = []

while count < n:
    count = count + 1
    print "Define name for actor ", count, ":"
    name = raw_input ()
    nams.append(name)

if nams[2]: #I am trying to say 'if nams[2] exists, do something depending on len(nams)
    if len(nams) > 3:
        do_something
    if len(nams) > 4
        do_something_else

if nams[3]: #etc.
user1569317
quelle
1
Sieht so aus, nals ob Sie cast als Ganzzahl und nicht als Liste eingeben möchten . Ich bin verwirrt.
MVChr
2
Ja, das eigentliche Problem hier verwendet , nanstatt namsin den ifs
Wooble
In Ihrem Fall ist n keine Liste. Überprüfen Sie zuerst, ob es sich um eine Ganzzahl handelt, und führen Sie dann eine Iteration oder Aufzählung durch, je nachdem, welchen Effekt Sie erzielen möchten.
Entspannt
Ja, falsch geschrieben.
Behoben
"Die Tatsache, dass ich sub if-Anweisungen über len (my_list) habe." Haben Sie darüber nachgedacht, was impliziert wird, welche Listenindizes existieren, weil lendie Liste mindestens einen bestimmten Wert hat?
Karl Knechtel

Antworten:

157

Könnte es für Sie nützlicher sein, die Länge der Liste len(n)zu verwenden, um Ihre Entscheidung zu informieren, als n[i]nach jeder möglichen Länge zu suchen?

JonathanV
quelle
6
Ja. Bei der Überprüfung des Codes war meine Einrichtung völlig überflüssig. len (n) hat alles erreicht, was ich brauchte. Danke für einen Punkt in die richtige Richtung.
user1569317
1
Dies berücksichtigt keine negativen Indizes. Der beste Weg, den ich kenne, ist versuchen / außer IndexError, aber es wäre schön, einen prägnanten Weg zu haben, um einen Bool zu bekommen
Abram
In Python zählen negative Indizes für Listen ab dem Ende der Liste nur rückwärts. Sie könnten also nicht in einer Weise existieren, die sich auf die Länge der Liste auswirkt.
JonathanV
84

Ich muss so codieren, dass, wenn ein bestimmter Listenindex vorhanden ist, eine Funktion ausgeführt wird.

Dies ist die perfekte Verwendung für einen Try-Block :

ar=[1,2,3]

try:
    t=ar[5]
except IndexError:
    print('sorry, no 5')   

# Note: this only is a valid test in this context 
# with absolute (ie, positive) index
# a relative index is only showing you that a value can be returned
# from that relative index from the end of the list...

Per Definition sind jedoch alle Elemente in einer Python-Liste zwischen 0und len(the_list)-1vorhanden (dh es ist kein Versuch erforderlich, es sei denn, Sie wissen es 0 <= index < len(the_list)).

Sie können enumerate verwenden, wenn die Indizes zwischen 0 und dem letzten Element liegen sollen:

names=['barney','fred','dino']

for i, name in enumerate(names):
    print(i + ' ' + name)
    if i in (3,4):
        # do your thing with the index 'i' or value 'name' for each item...

Wenn Sie nach einem definierten 'Index'-Gedanken suchen, stellen Sie wahrscheinlich die falsche Frage. Vielleicht sollten Sie einen Zuordnungscontainer (z. B. ein Diktat) gegenüber einem Sequenzcontainer (z. B. eine Liste) verwenden. Sie können Ihren Code folgendermaßen umschreiben:

def do_something(name):
    print('some thing 1 done with ' + name)

def do_something_else(name):
    print('something 2 done with ' + name)        

def default(name):
    print('nothing done with ' + name)     

something_to_do={  
    3: do_something,        
    4: do_something_else
    }        

n = input ("Define number of actors: ")
count = 0
names = []

for count in range(n):
    print("Define name for actor {}:".format(count+1))
    name = raw_input ()
    names.append(name)

for name in names:
    try:
        something_to_do[len(name)](name)
    except KeyError:
        default(name)

Läuft wie folgt:

Define number of actors: 3
Define name for actor 1: bob
Define name for actor 2: tony
Define name for actor 3: alice
some thing 1 done with bob
something 2 done with tony
nothing done with alice

Sie können auch die .get- Methode verwenden, anstatt / zu versuchen, mit Ausnahme einer kürzeren Version:

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice
dawg
quelle
3
Block versuchen? Ich bin ein Anfänger in Python, aber dies scheint ein großes Nein Nein in der Programmierung zu sein ... Ausnahmen für die Flusskontrolle? Ausnahme sollte für Dinge sein, die wir nicht richtig kontrollieren können?
Luis
3
@Luis Ich bin auch ein Anfänger in Python, aber von dem, was ich in diesen Fällen über die Ausnahmebehandlung gelesen habe, ist der Stil, den Python fördert, den C / Java / C # nicht fördert. Siehe stackoverflow.com/questions/11360858/…
Tinister
Der Satz 'Alle Indizes in einer Python-Liste zwischen 0 und len (Liste)' ist absolut falsch. Angenommen, es gibt eine Liste x = [1, 2, 3] mit len_x = 3. Es gibt keinen Index wie 3. Der Satz hätte lauten sollen: 'Alle Indizes in einer Python-Liste zwischen 0 und len (Liste) - 1' .
Lior Magen
9
@LiorMagen: Du hast recht und ich habe es bearbeitet. Es ist ziemlich hart, einen ziemlich populären Beitrag für einen solchen pedantischen Fehler abzustimmen. Ein einfacher Kommentar würde ausreichen.
Morgengrauen
Ich werde darauf hinweisen, dass Dinge in ein Festhalten tryist nicht Ihnen sagen , wenn der Index nur existiert , wenn es abrufbaren ist - nehmen -1- dieser Index nicht wirklich existiert , sondern ein Wert würde zurückgegeben werden.
George Mauer
17

len(nams)sollte gleich nin Ihrem Code sein. Alle Indizes 0 <= i < n"existieren".

jfs
quelle
15

Dies kann einfach mit dem folgenden Code erfolgen:

if index < len(my_list):
    print(index, 'exists in the list')
else:
    print(index, "doesn't exist in the list")
user6039980
quelle
6

Ich muss so codieren, dass, wenn ein bestimmter Listenindex vorhanden ist, eine Funktion ausgeführt wird.

Sie wissen bereits, wie Sie dies testen können, und führen solche Tests bereits in Ihrem Code durch .

Die gültigen Indizes für eine Liste der Länge nsind 0bis n-1einschließlich.

Eine Liste hat also i genau dann einen Index, wenn die Länge der Liste mindestens beträgt i + 1.

Karl Knechtel
quelle
Ja, ich hatte die Werkzeuge, um mein Problem zu lösen, habe sie einfach nicht klar angewendet. Danke für einen Punkt in die richtige Richtung.
user1569317
Vielen Dank dafür, insbesondere für den letzten Satz, der eine wichtige Eigenschaft von Python-Listen ist, die sie von JavaScript-Arrays und anderen ähnlichen Konstrukten unterscheidet.
Robert
6

Die Verwendung der Länge der Liste wäre die schnellste Lösung, um zu überprüfen, ob ein Index vorhanden ist:

def index_exists(ls, i):
    return (0 <= i < len(ls)) or (-len(ls) <= i < 0)

Dies testet auch auf negative Indizes und die meisten Sequenztypen (Like rangesundstr s), die eine Länge haben.

Wenn Sie danach trotzdem auf das Element in diesem Index zugreifen müssen, ist es einfacher, um Vergebung als um Erlaubnis zu bitten , und es ist auch schneller und pythonischer. Verwenden Sie try: except:.

try:
    item = ls[i]
    # Do something with item
except IndexError:
    # Do something without the item

Dies wäre im Gegensatz zu:

if index_exists(ls, i):
    item = ls[i]
    # Do something with item
else:
    # Do something without the item
Artyer
quelle
3

Wenn Sie die eingefügten Akteursdaten iterieren möchten:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else
Gepatino
quelle
1

ok, also ich denke es ist tatsächlich möglich (aus Gründen der Argumentation):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False
avloss
quelle
obwohl dies noch einfacher wäre:3 in range(len(your_list)
avloss
1
oder sogar das 3 in xrange(len(your_list)- kann es wahrscheinlich nicht besser machen
avloss
1

Sie können so etwas versuchen

list = ["a", "b", "C", "d", "e", "f", "r"]

for i in range(0, len(list), 2):
    print list[i]
    if len(list) % 2 == 1 and  i == len(list)-1:
        break
    print list[i+1];
Suresh Kumar
quelle
1

Einzeiler:

do_X() if len(your_list) > your_index else do_something_else()  

Vollständiges Beispiel:

In [10]: def do_X(): 
    ...:     print(1) 
    ...:                                                                                                                                                                                                                                      

In [11]: def do_something_else(): 
    ...:     print(2) 
    ...:                                                                                                                                                                                                                                      

In [12]: your_index = 2                                                                                                                                                                                                                       

In [13]: your_list = [1,2,3]                                                                                                                                                                                                                  

In [14]: do_X() if len(your_list) > your_index else do_something_else()                                                                                                                                                                      
1

Nur zur Info. Imho, try ... except IndexErrorist eine bessere Lösung.

Eduard Golubov
quelle
-3

Lassen Sie keinen Platz vor Ihren Halterungen.

Beispiel:

n = input ()
         ^

Tipp: Sie sollten Kommentare über und / oder unter Ihrem Code hinzufügen. Nicht hinter deinem Code.


Einen schönen Tag noch.

Mr. Robot
quelle
Willkommen bei SO! Ihre Antwort sieht eher wie ein Kommentar als wie eine Antwort aus. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren . Überprüfen Sie auch, was ich stattdessen tun kann . Wenn Sie antworten möchten, lesen Sie diese Anleitung, um die SO-Richtlinien zu befolgen.
thewaywewere
-3

Viele Antworten, nicht die einfache.

So überprüfen Sie, ob bei dictionary dict eine Index-ID vorhanden ist:

dic = {}
dic['name'] = "joao"
dic['age']  = "39"

if 'age' in dic

Gibt true zurück, wenn 'age' vorhanden ist.

Marco
quelle
1
Keine gute Antwort auf die Frage. Die Frage betraf Listen, keine Wörterbücher. Was Sie vorgeschlagen haben, kann in solchen Fällen nicht getan werden: ["joao", 39]
Ruhrpottpatriot