filtrer les éléments dans un python dictionnaire dont les clés contiennent une chaîne de caractères
Je suis un codeur C le développement de quelque chose en python. Je sais comment effectuer les opérations suivantes en C (et donc en C-comme la logique appliquée en cas de python), mais je me demandais ce que le "Python" de faire il est.
J'ai un dictionnaire d, et j'aimerais le faire fonctionner sur un sous-ensemble des éléments, seulement ceux qui s key (string) comprend une sous-chaîne.
c'est à dire le C logique serait:
for key in d:
if filter_string in key:
# do something
else
# do nothing, continue
J'imagine la version de python serait quelque chose comme
filtered_dict = crazy_python_syntax(d, substring)
for key,value in filtered_dict.iteritems():
# do something
J'ai trouvé beaucoup de posts ici sur le filtrage des dictionnaires, mais ne pouvait pas en trouver un qui impliquait exactement cela.
Mon dictionnaire n'est pas imbriqué et j'utilise python 2.7
Vous devez vous connecter pour publier un commentaire.
Un dict compréhension:
Un vous le voyez, il devrait être auto-explicatif, comme on le lit comme l'anglais assez bien.
Cette syntaxe nécessite Python 2.7 ou plus.
En Python 3, il y a seulement
dict.les éléments()
, pasiteritems()
donc vous l'utiliser:filtered_dict = {k:d[k] for k in d if filter_string in k}
?d[k]
de recherche.# do something
dans les commentaires, mais nous déposer quelques touches ici.iteritems
en Python 3? Je ne le pense pas. Donc, ma version est compatible, non?iteritems
avecitems
, qui est le même que Python 2.7 estiteritems
.Aller pour ce que c'est plus lisible et facilement maintenable. Juste parce que vous pouvez l'écrire en une seule ligne ne signifie pas que vous devriez. Votre solution existante est proche de ce que je voudrais utiliser d'autres que je ne l'utilisateur iteritems pour ignorer la valeur de recherche, et je déteste imbriquée fi si je peux les éviter:
Toutefois, si vous realllly voulez quelque chose pour vous permettre de parcourir une filtré dict puis je ne voudrais pas faire les deux étapes de la construction de l'filtré dict et puis en itérant à travers elle, mais au lieu d'utiliser un générateur, parce que ce qui est plus pythonic (et génial) qu'un générateur?
D'abord, nous créons notre générateur, et une bonne conception de la dicte que nous faisons, il est suffisamment abstrait pour être réutilisable:
Et ensuite, nous pouvons utiliser le générateur pour résoudre votre problème, agréable et propre avec de simples, compréhensibles code:
En bref: les générateurs sont génial.
iteritems()
va être plus efficace queitems()
.items()
, qui agit comme le Python 2.7 estiteritems
.Jonathon vous a donné une approche à l'aide dict interprétations dans sa réponse. Ici, c'est une approche qui s'applique à votre faire quelque chose partie.
Si vous voulez faire quelque chose avec les valeurs du dictionnaire, vous n'avez pas besoin d'un dictionnaire de la compréhension à tous:
Je suis en utilisant
iteritems(
) depuis que vous avez attaché votre question python 2.7Maintenant le résultat sera une liste avec
some_function
appliquée à chaque paire clé/valeur du dictionnaire, qui afoo
dans sa clé.Si vous voulez juste de traiter avec les valeurs et ignorer les touches, il suffit de changer la compréhension de liste:
some_function
peut être appelable, de sorte qu'un lambda fonctionnerait ainsi:L'intérieur de la liste est en fait pas nécessaire, comme vous pouvez vous en passer un générateur d'expression à la carte ainsi:
map(lambda a: a[0]*a[1], ((k,v) for k,v in {2:2, 3:2}.iteritems() if k == 2))
- cela vous permettra de[4]
.map
est une compréhension de liste.[f(v) for k, v in d.iteritems() if substring in k]
Je pense que c'est beaucoup plus lisible, et plus efficace.results = list(starmap(...))
oufor result in starmap(...): ...
).Vous pouvez utiliser le haut- fonction de filtre pour filtrer les dictionnaires, listes, etc. basés sur des conditions spécifiques.
L'avantage est que vous pouvez l'utiliser pour différentes structures de données.
items:
devrait êtreitem:
dans le lambda définition.