web-dev-qa-db-fra.com

Si la liste existe, faites X

Dans mon programme, l'utilisateur saisit le numéro n, puis le nombre n de chaînes, qui sont stockées dans une liste.

J'ai besoin d'un code tel que si un certain index de liste existe, alors exécutez une fonction.

Ceci est rendu plus compliqué par le fait que j'ai imbriqué si des déclarations sur len(my_list).

Voici une version simplifiée de ce que j'ai maintenant, qui ne fonctionne pas:

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.
85
user1569317

Pourrait-il être plus utile que vous utilisiez la longueur de la liste len(n) pour informer votre décision plutôt que de cocher n[i] pour chaque longueur possible? 

101
JonathanV

J'ai besoin d'un code tel que si un certain index de liste existe, lancez une fonction.

C'est l'utilisation idéale pour un try block :

ar=[1,2,3]

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

Cependant, par définition, tous les éléments d’une liste Python entre 0 et len(the_list)-1 existent (c’est-à-dire qu’il n’est pas nécessaire d’essayer, sauf si vous connaissez 0 <= index < len(the_list)). 

Vous pouvez utiliser enumerate si vous souhaitez que les index soient compris entre 0 et le dernier élément:

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...

Si vous recherchez une pensée d'index définie, je pense que vous posez la mauvaise question. Vous devriez peut-être envisager d'utiliser un conteneur mapping (tel qu'un dict) par rapport à un conteneur { séquence } (telle qu'une liste). Vous pouvez réécrire votre code comme ceci:

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)

Fonctionne comme ceci:

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

Vous pouvez également utiliser la méthode .get plutôt que d'essayer/sauf pour une version plus courte:

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice
64
dawg

len(nams) devrait être égal à n dans votre code. Tous les index 0 <= i < n "existent".

11
jfs

Utiliser la longueur de la liste serait la solution la plus rapide pour vérifier si un index existe:

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

Cela vérifie également les indices négatifs et la plupart des types de séquence (comme ranges et strs) ayant une longueur.

De toute façon, si vous avez besoin d'accéder ultérieurement à l'élément à cet index, il est plus facile de demander pardon que l'autorisation , et il est également plus rapide et plus pythonique. Utilisez try: except:.

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

Ce serait comme opposé à:

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

J'ai besoin d'un code tel que si un certain index de liste existe, alors exécutez une fonction.

Vous savez déjà comment tester cela et en fait effectuez déjà de tels tests dans votre code .

Les indices valides pour une liste de longueur n sont 0 à n-1 inclus.

Ainsi, une liste a un index i si et seulement si la longueur de la liste est au moins i + 1.

3
Karl Knechtel

Si vous souhaitez itérer les données d'acteur insérées:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else
2
gepatino

Cela peut être fait simplement en utilisant le code suivant:

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

Vous pouvez essayer quelque chose comme ça 

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];
0
Suresh Kumar

ok, donc je pense que c'est réellement possible (pour des raisons de discussion):

>>> your_list = [5,6,7]
>>> 2 in Zip(*enumerate(your_list))[0]
True
>>> 3 in Zip(*enumerate(your_list))[0]
False
0
avloss

Beaucoup de réponses, pas les plus simples.

Pour vérifier si un index 'id' existe dans dict dict:

if 'id' in Dict

renvoie true si 'id' existe.

0
Marco