Je suis un codeur C développant quelque chose en python. Je sais comment faire ce qui suit en C (et donc en logique C-like appliquée à python), mais je me demande quelle est la façon `` Python '' de le faire.
J'ai un dictionnaire d, et j'aimerais opérer sur un sous-ensemble d'éléments, seuls ceux dont la clé (chaîne) contient une sous-chaîne spécifique.
c'est-à-dire que la logique C serait:
for key in d:
if filter_string in key:
# do something
else
# do nothing, continue
J'imagine que la version python serait quelque chose comme
filtered_dict = crazy_python_syntax(d, substring)
for key,value in filtered_dict.iteritems():
# do something
J'ai trouvé de nombreux articles ici concernant le filtrage des dictionnaires, mais je n'ai pas pu en trouver un qui impliquait exactement cela.
Mon dictionnaire n'est pas imbriqué et j'utilise python 2.7
Réponses:
Que diriez-vous d'une compréhension de dict :
Une fois que vous le voyez, cela devrait être explicite, car il se lit assez bien comme l'anglais.
Cette syntaxe nécessite Python 2.7 ou supérieur.
Dans Python 3, il n'y a que
dict.items()
, pasiteritems()
donc vous utiliseriez:la source
filtered_dict = {k:d[k] for k in d if filter_string in k}
?d[k]
recherche.# do something
dans les commentaires, mais nous déposons quelques clés ici.iteritems
en Python 3? Je ne pense pas. Alors, ma version serait compatible, non?iteritems
paritems
, qui est identique à Python 2.7iteritems
.Optez pour ce qui est le plus lisible et le plus facile à maintenir. Ce n'est pas parce que vous pouvez l'écrire sur une seule ligne que vous devriez le faire. Votre solution existante est proche de ce que j'utiliserais autrement que j'utiliserais des itérités pour ignorer la recherche de valeur, et je déteste les if imbriqués si je peux les éviter:
Cependant, si vous voulez vraiment que quelque chose vous permette d'itérer à travers un dict filtré, je ne ferais pas le processus en deux étapes de construction du dict filtré, puis de l'itérer, mais plutôt d'utiliser un générateur, car ce qui est plus pythonique (et génial) que un générateur?
Tout d'abord, nous créons notre générateur, et une bonne conception nous oblige à le rendre suffisamment abstrait pour être réutilisable:
Et puis nous pouvons utiliser le générateur pour résoudre votre problème de manière agréable et propre avec un code simple et compréhensible:
En bref: les générateurs sont géniaux.
la source
Vous pouvez utiliser la fonction de filtre intégrée pour filtrer les dictionnaires, listes, etc. en fonction de conditions spécifiques.
L'avantage est que vous pouvez l'utiliser pour différentes structures de données.
la source
items:
devrait êtreitem:
dans la définition lambda.la source
iteritems()
va être plus efficace queitems()
.items()
, qui agit comme Python 2.7iteritems
.Jonathon vous a donné une approche utilisant des compréhensions dict dans sa réponse . Voici une approche qui traite de votre partie faire quelque chose .
Si vous voulez faire quelque chose avec les valeurs du dictionnaire, vous n'avez pas du tout besoin d'une compréhension du dictionnaire:
J'utilise
iteritems(
) puisque vous avez tagué votre question avecpython-2.7Maintenant, le résultat sera dans une liste avec
some_function
appliqué à chaque paire clé / valeur du dictionnaire, qui afoo
dans sa clé.Si vous voulez simplement traiter les valeurs et ignorer les clés, changez simplement la compréhension de la liste:
some_function
peut être n'importe quel appelable, donc un lambda fonctionnerait également:La liste interne n'est en fait pas requise, car vous pouvez également transmettre une expression de générateur à la carte:
la source
map(lambda a: a[0]*a[1], ((k,v) for k,v in {2:2, 3:2}.iteritems() if k == 2))
- cela vous donnera[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(...))
-à- dire oufor result in starmap(...): ...
).