Si l'index de la liste existe, faites X

129

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

J'ai besoin de coder de telle sorte que si un certain index de liste existe, exécutez une fonction.

Ceci est rendu plus compliqué par le fait que j'ai imbriqué des déclarations if about 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.
utilisateur1569317
la source
1
Il semble que vous souhaitiez taper le cast nsous forme d'entier et non de liste. Je suis confus.
mVChr
2
Oui, le vrai problème ici est d'utiliser nau lieu de namsdans le ifs
Wooble
Dans votre cas, n n'est pas une liste. Commencez par vérifier (transtyper) pour qu'il s'agisse d'un entier, puis vous pouvez itérer ou énumérer en fonction de l'effet que vous souhaitez obtenir.
décontracté
Oui, mal tapé. Fixé sur nams []
user1569317
"le fait que j'ai des déclarations sub if sur len (ma_liste)." Avez-vous réfléchi à ce qu'implique les indices de liste existants, par le fait que le lende la liste est au moins une certaine valeur?
Karl Knechtel

Réponses:

157

Serait-il plus utile pour vous d'utiliser la longueur de la liste len(n)pour éclairer votre décision plutôt que de vérifier n[i]chaque longueur possible?

JonathanV
la source
6
Oui. Après avoir examiné le code, ma configuration était complètement superflue; len (n) a accompli tout ce dont j'avais besoin. Merci pour un point dans la bonne direction.
user1569317
1
Cela ne tient pas compte des indices négatifs. Le meilleur moyen que je connaisse est d'essayer / sauf IndexError, mais ce serait bien d'avoir un moyen concis pour obtenir un bool
Abram
En Python, les index négatifs sur les listes comptent simplement à rebours à partir de la fin de la liste. Donc, ils ne pouvaient pas exister d'une manière qui aurait un impact sur la longueur de la liste.
JonathanV
84

J'ai besoin de coder de telle sorte que si un certain index de liste existe, exécutez une fonction.

C'est l'utilisation parfaite pour un bloc try :

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

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

Vous pouvez utiliser enumerate si vous voulez les index 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 cherchez une pensée «index» définie, je pense que vous posez la mauvaise question. Vous devriez peut-être envisager d'utiliser un conteneur de mappage (tel qu'un dict) par rapport à un conteneur de séquence (tel 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 try / 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
dawg
la source
3
essayer de bloquer? Je suis un débutant en Python mais cela semble être un grand non non en programmation ... des exceptions pour le contrôle de flux? L'exception devrait être pour les choses que nous ne pouvons pas contrôler, n'est-ce pas?
Luis
3
@Luis Je suis également un débutant en Python, mais d'après ce que j'ai lu sur la gestion des exceptions dans ces instances, c'est le style que Python promeut que C / Java / C # ne fait pas. Voir stackoverflow.com/questions/11360858/…
Tinister
La phrase «tous les indices d'une liste Python entre 0 et len ​​(liste)» est absolument fausse. Disons qu'il y a une liste x = [1, 2, 3] qui len_x = 3. Il n'y a pas d'index tel que 3. La phrase aurait dû être: 'tous les indices dans une liste Python entre 0 et len ​​(liste) - 1' .
Lior Magen
9
@LiorMagen: Vous avez raison et je l'ai édité. C'est un peu dur de voter contre un poste assez populaire pour une erreur aussi pédante. Un simple commentaire suffirait.
dawg
Je vais souligner que coller choses à l' intérieur d' un tryne pas vous dire si l'indice existe juste si elle est fetchable - prendre -1- cet indice n'a pas vraiment existe , mais une valeur serait renvoyée.
George Mauer
17

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

jfs
la source
15

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")
utilisateur6039980
la source
6

J'ai besoin de coder de telle sorte que si un certain index de liste existe, exécutez une fonction.

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

Les indices valides pour une liste de longueur nsont 0par n-1inclus.

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

Karl Knechtel
la source
Oui, j'avais les outils pour résoudre mon problème, je ne les appliquais tout simplement pas clairement. Merci pour un point dans la bonne direction.
user1569317
Merci pour cela, en particulier la dernière phrase, qui est une propriété importante des listes Python qui les différencie des tableaux JavaScript et d'autres constructions similaires.
robert
6

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 teste également les indices négatifs et la plupart des types de séquence (Like rangeset strs) qui ont une longueur.

Si vous avez de toute façon besoin d'accéder à l'élément à cet index par la suite, il est plus facile de demander pardon que la permission , et c'est aussi 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 par opposition à:

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

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

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

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

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False
avloss
la source
bien que ce soit encore plus simple:3 in range(len(your_list)
avloss
1
ou même ceci 3 in xrange(len(your_list)- ne peut probablement pas faire mieux que cela
avloss
1

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];
Suresh Kumar
la source
1

Bon mot:

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

Exemple complet:

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

Juste pour info. Imho, try ... except IndexErrorest une meilleure solution.

Eduard Golubov
la source
-3

Ne laissez aucun espace devant vos supports.

Exemple:

n = input ()
         ^

Astuce: vous devez ajouter des commentaires sur et / ou sous votre code. Pas derrière votre code.


Bonne journée.

M. Robot
la source
Bienvenue à SO! Votre réponse ressemble à un commentaire plutôt qu'à une réponse. Une fois que vous aurez une réputation suffisante, vous pourrez commenter n'importe quel message. Vérifiez également ce que puis-je faire à la place . Si vous aviez l'intention de répondre, lisez cette procédure pour suivre les directives SO.
thewaywewere
-3

Beaucoup de réponses, pas la simple.

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

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

if 'age' in dic

renvoie true si «age» existe.

Marco
la source
1
Pas une bonne réponse à la question. La question portait sur les listes, pas sur les dictionnaires. Ce que vous proposez ne peut pas être fait dans des cas comme celui-ci: ["joao", 39]
Ruhrpottpatriot