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?
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.
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.
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.
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])
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.
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