2010-01-13 8 views
1
thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}] 

Comment puis-je dire:Comment déterminer si un élément est dans une liste?

If "red" is in thelist and time does not equal 2 for that element (that's we just got from the list): 
+0

Y at-il une différence de vitesse entre réponse « wallacoloo » et la compréhension de la liste/réponses pythonique? – TIMEX

Répondre

13

En utilisant any() pour savoir s'il y a un élément satisfaisant les conditions:

>>> any(item['color'] == 'red' and item['time'] != 2 for item in thelist) 
False 
+0

c'est gentil! Est-ce que je comprends bien que les parenthèses de any() doublent en tant que générateur, donc any() évalue la compréhension de la liste item par item et renvoie True une fois qu'il trouve un item qui satisfait les critères? – Ben

+1

C'est une "expression de générateur", disponible dans une version raisonnable de python (depuis 2.4). On pourrait aussi écrire 'any ([...])' pour obtenir une compréhension classique de la liste. (Voir http://www.python.org/dev/peps/pep-0289/ pour en savoir plus sur les expressions de générateur) – sth

+0

C'est le genre de truc qui me fait aimer Python. – orokusaki

1
def colorRedAndTimeNotEqualTo2(thelist): 
    for i in thelist: 
     if i["color"] == "red" and i["time"] != 2: 
      return True 
    return False 

print colorRedAndTimeNotEqualTo2([{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}]) 

pour i dans itère TheList par theList, attribuant l'élément courant i et de faire le reste du code dans le bloc (pour chaque valeur de i)

Merci pour la prise, Benson.

+0

battu au coup de poing de 30 secondes - c'est exactement ce que je ferais. Excepté, juste pour être dans l'habitude de python 3: print (i) – Ben

+1

C'est faisable, mais l'utilisation d'une boucle for signifie que s'il y avait plus d'un élément avec la couleur == red et time! = 2 vous auriez imprimé deux fois. – Benson

0

Vous pouvez effectuer la plupart des manipulations de liste dans une compréhension de liste. Voici un qui fait une liste de fois pour tous les éléments où la couleur est rouge. Ensuite, vous pouvez demander si 2 existe dans ces moments.

thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}] 
reds = (x['time'] == 2 for x in thelist if x['color'] == red) 
if False in reds: 
    do_stuff() 

Vous pouvez condenser encore plus loin en éliminant les variables « rouges » comme ceci:

thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}] 
if False in (x['time'] == 2 for x in thelist if x['color'] == red): 
    do_stuff() 
+0

cela nécessite 2 recherches au lieu de 1 (une pour obtenir l'élément, une autre pour trouver Faux). cela nécessite également plus de RAM (la compréhension de la liste pourrait générer un résultat énorme). iterating serait plus efficace – jspcal

+0

Je suis passé à la compréhension des générateurs plutôt qu'à la compréhension des listes, puisque (comme jspcal l'a dit) les listes n'étaient pas nécessaires. – Benson

0

Eh bien, il n'y a rien aussi élégant que « trouver », mais vous pouvez utiliser une compréhension de la liste:

matches = [x for x in thelist if x["color"] == "red" and x["time"] != 2] 
if len(matches): 
    m = matches[0] 
    # do something with m 

Cependant, je trouve le [0] et len ​​() fastidieux. J'utilise souvent une boucle avec une tranche de tableau, comme:

matches = [x for x in thelist if x["color"] == "red" and x["time"] != 2] 
for m in matches[:1]: 
    # do something with m 
+0

Je supposais un "au plus un" genre de trouver. Si vous voulez tous les matches, je m'en remettrais à la réponse de quelqu'un d'autre. – jpsimons

0
list = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}] 
for i in list: 
    if i['color'] == 'red' && i['time'] != 2: 
    print i 
+0

Peut-être que c'est trop négligeable, mais je vous recommande d'éviter de nommer les choses "liste", car vous pourriez avoir besoin d'accéder au constructeur de la liste et il serait dommage de l'avoir écrasé. – Benson

+0

Python utilise "et" au lieu de "&&" – Ponkadoodle

0
for val in thelist: 
    if val['color'] == 'red' and val['time'] != 2: 
     #do something here 

Mais il ne ressemble pas à c'est la structure de données droit d'utiliser.

Questions connexes