web-dev-qa-db-fra.com

Itération sur les valeurs dict

Si je voudrais parcourir les valeurs de dictionnaire stockées dans un tuple.

j'ai besoin de retourner l'objet qui contient la valeur "CI", je suppose que j'aurai besoin d'une sorte de boucle for:

z = {'x':(123,SE,2,1),'z':(124,CI,1,1)}
for i, k in db.z:
    for k in db.z[i]:
        if k == 'CI':
            return db.z[k]

il me manque probablement quelque chose ici, un point de référence serait bon.

s'il y a un moyen plus rapide de le faire, tout cela aiderait grandement

15
Mike.G
z = {'x':(123,"SE",2,1),'q':(124,"CI",1,1)}
for i in z.keys(): #reaching the keys of dict
    for x in z[i]: #reaching every element in tuples
        if x=="CI": #if match found..
            print ("{} holding {}.".format(i,x)) #printing it..

Cela pourrait résoudre votre problème.

Sortie:

>>> 
q holding CI.
>>> 

Modifier pour votre commentaire:

def func(*args):
    mylist=[]
    z = {'x':(123,"SE",2,1),'q':(124,"CI",1,1)}
    for x,y in z.items():
        for t in args:
            if t in y:
                mylist.append(x)
    return mylist
print (func(1,"CI"))

Sortie:

>>> 
['q', 'q', 'x']
>>>  

J'espère que c'est ce que vous voulez, sinon la première méthode imprime déjà toutes les clés, exemple de sortie:

if x==1 or x=="CI":

>>> 
x holding 1.
q holding CI.
q holding 1.
q holding 1.
>>> 
13
GLHF

Façons d'itérer sur un dictionnaire

Tout d'abord, il existe plusieurs façons de parcourir un dictionnaire.

Boucle directement sur le dictionnaire:

>>> z = {'x':(123,'SE',2,1),'z':(124,'CI',1,1)}
>>> for key in z:
...     print key,
...
'x' 'z'

Notez que les variables de boucle qui sont renvoyées lorsque vous bouclez simplement sur un dictionnaire sont les clés, pas les valeurs associées à ces clés.

Faire une boucle sur les valeurs d'un dictionnaire:

>>> z = {'x':(123,'SE',2,1),'z':(124,'CI',1,1)}
>>> for value in z.values(): # Alternatively itervalues() for memory-efficiency (but ugly)
...     print value,
...
(123,'SE',2,1) (124,'CI',1,1)

En boucle sur les clés et les valeurs:

>>> z = {'x':(123,'SE',2,1),'z':(124,'CI',1,1)}
>>> for key, value in z.items(): # Again, iteritems() for memory-efficiency
...     print key, value,
...
'x' (123,'SE',2,1) 'z' (124,'CI',1,1)

Les deux derniers sont un peu plus efficaces que de boucler sur des clés et d'exécuter z [clé] pour obtenir la valeur. C'est aussi sans doute plus lisible.

S'appuyant sur ces ...

Liste des compréhensions

Comprendre la liste sont excellents. Pour le cas simple de recherche de "CI" uniquement:

>>> z = {'x':(123,'SE',2,1),'z':(124,'CI',1,1)}
>>> [key for key, value in z.items() if 'CI' in value]
['z']

Pour rechercher des clés dict contenant plusieurs éléments de recherche:

>>> z = {'x':(123,'SE',2,1),'z':(124,'CI',1,1)}
>>> search_items = ('CI', 1) # Only keys that hold both CI and 1 will match
>>> [key for key, value in z.items() if all(item in value for item in search_items)]
['z']

Pour rechercher des clés dict qui contiennent plusieurs éléments de recherche:

>>> z = {'x':(123,'SE',2,1),'z':(124,'CI',1,1)}
>>> search_items = ('CI', 'SE', 'JP') # Keys that hold any of the three items will match
>>> [key for key, value in z.items() if any(item in value for item in search_items)]
['x', 'z']

Si les deux derniers semblent un peu trop complexes en tant que lignes simples, vous pouvez réécrire le dernier bit en tant que fonction distincte.

>>> z = {'x':(123,'SE',2,1),'z':(124,'CI',1,1)}
>>> search_items = ('CI', 'SE', 'JP') # Keys that hold any of the three items will match
>>> def match_any(dict_value, search_items):
...     return any(item in dict_value for item in search_items)
...
>>> [key for key, value in z.items() if match_any(value, search_items)]
['x', 'z']

Une fois que vous vous êtes habitué à la syntaxe [x for x in iterable if condition (x)], le format devrait être très facile à lire et à suivre.

33
zehnpaard

essaye ça:

>>> z = {'x':(123,'SE',2,1),'z':(124,'CI',1,1)}
>>> list(filter(lambda x:'CI' in z.get(x),z))
['z']
2
Hackaholic
z = {'x':(123,"SE",2,1),'q':(124,"CI",1,1)}
for key, val in z.items():
    if 'CI' in val:
        return z[key]
1
Urban48

Il n'est pas nécessaire de récupérer la clé si vous êtes uniquement intéressé par les valeurs:

Dans Python 2.x:

z = {'x':(123,"SE",2,1),'q':(124,"CI",1,1)}
for value in z.itervalues():
    if 'CI' in value:
        return value

Dans Python 3.x:

z = {'x':(123,"SE",2,1),'q':(124,"CI",1,1)}
for value in z.values():
    if 'CI' in value:
        return value
0
franksands