Comment filtrer un dictionnaire conformément à l'arbitraire d'un état de fonctionner?
J'ai un dictionnaire de points, par exemple:
>>> points={'a':(3,4), 'b':(1,2), 'c':(5,5), 'd':(3,3)}
Je veux créer un nouveau dictionnaire avec tous les points dont la valeur x et y est plus petit que 5, c'est à dire des points 'a', 'b' et 'd'.
Selon la le livre, chaque dictionnaire a la items()
fonction qui retourne une liste de (key, pair)
tuple:
>>> points.items()
[('a', (3, 4)), ('c', (5, 5)), ('b', (1, 2)), ('d', (3, 3))]
J'ai donc écrit ceci:
>>> for item in [i for i in points.items() if i[1][0]<5 and i[1][1]<5]:
... points_small[item[0]]=item[1]
...
>>> points_small
{'a': (3, 4), 'b': (1, 2), 'd': (3, 3)}
Est-il un moyen plus élégant? Je m'attendais à Python d'avoir quelques super-génial dictionary.filter(f)
fonction...
Vous devez vous connecter pour publier un commentaire.
De nos jours, dans Python 2.7 et le haut, vous pouvez utiliser un dict compréhension:
Et en Python 3:
iteritems
a été supprimé en Python 3. Mais vous pouvez utiliseritems
à la place. Il se comporte de la façoniteritems
œuvres dans les anciennes versions.Vous pourriez choisir d'appeler
.iteritems()
au lieu de.items()
si vous êtes en Python 2 etpoints
peut avoir un beaucoup d'entrées.all(x < 5 for x in v)
peut-être exagéré si vous savez que chaque point sera toujours en 2D seulement (dans ce cas, vous pourriez exprimer la même contrainte avec unand
), mais il fonctionne parfaitement;-).(3, 10)
va passer le test:(3, 10) < (5, 5)
est Vrai, mais c'est faux (y
devrait être inférieure à 5 ainsi).Je pense que Alex Martelli la réponse est certainement la façon la plus élégante de le faire, mais je voulais juste ajouter un moyen de satisfaire votre envie pour une super génial
dictionary.filter(f)
méthode dans un Pythonic sorte de passage:En gros, nous avons créer une classe qui hérite de
dict
, mais ajoute de la méthode de filtrage. Nous avons besoin d'utiliser.items()
pour le filtrage, puisque l'utilisation de.iteritems()
tout de façon destructrice de l'itération va raise exception.