web-dev-qa-db-fra.com

Le meilleur moyen de filtrer un dictionnaire en Python

J'ai un dictionnaire de clés de chaîne et de valeurs float. 

 mydict = {}
 mydict["joe"] = 20
 mydict["bill"] = 20.232
 mydict["tom"] = 0.0

Je souhaite filtrer le dictionnaire pour n'inclure que les paires ayant une valeur supérieure à zéro.

En C #, je ferais quelque chose comme ceci:

   dict = dict.Where(r=>r.Value > 0);

Quel est le code équivalent en Python?

15
leora
d = dict((k, v) for k, v in d.iteritems() if v > 0)

Dans Python 2.7 et supérieur, il existe une syntaxe plus agréable pour cela:

d = {k: v for k, v in d.items() if v > 0}

Notez que ce n'est pas strictement un filtre car il crée un nouveau dictionnaire.

42
kindall

essayer

y = filter(lambda x:dict[x] > 0.0,dict.keys())

le lambda alimente les clés à partir du dict et compare les valeurs du dict pour chaque clé aux critères, en renvoyant les clés acceptables.

1
Scott S

En supposant que votre dictionnaire original est d1, vous pourriez utiliser quelque chose comme:

d2 = dict((k, v) for k, v in d1.items() if v > 0)

En passant, notez que dict est déjà réservé en python.

0
srgerg

Le constructeur dict peut prendre une séquence de paires (key,value) et la méthode iteritems d'un dict produit une séquence de paires (key,value). Ce sont deux bons goûts qui vont bien ensemble.

newDict = dict([item for item in oldDict.iteritems() if item[1] > 0])
0
rob mayoff
foo = {}
foo["joe"] = 20
foo["bill"] = 20.232
foo["tom"] = 0.0

bar = dict((k,v) for k,v in foo.items() if v>0)

dict est un mot clé en Python, je l'ai donc remplacé par foo.

0
hzm

tout d'abord, vous ne devez pas utiliser le mot clé dict comme nom de variable car il pollue l'espace de noms et vous empêche de référencer la classe dict dans l'étendue actuelle ou incorporée.

d = {}
d["joe"] = 20
d["bill"] = 20.232
d["tom"] = 0.0

# create an intermediate generator that is fed into dict constructor 
# via a list comprehension
# this is more efficient that the pure "[...]" variant
d2 = dict(((k, v) for (k, v) in d.iteritems() if v > 0)) 

print d2
# {'bill': 20.232, 'joe': 20}

Alternativement, vous pouvez simplement créer le générateur et l'itérateur directement dessus. Cela ressemble plus à un "filtre", car le générateur fait uniquement référence aux valeurs du dict d'origine au lieu de créer une copie de sous-ensemble; et est donc plus efficace que la création d'un nouveau dictionnaire:

filtered = ((k, v) for (k, v) in d.iteritems() if v > 0)

print filtered 
# <generator object <genexpr> at 0x034A18F0>

for k, v in filtered:
    print k, v

# bill 20.232
# joe 20
0
Preet Kukreti