web-dev-qa-db-fra.com

python liste de filtres de dictionnaires basée sur la valeur de la clé

J'ai une liste de dictionnaires et chaque dictionnaire a une clé (disons) 'type' qui peut avoir les valeurs de 'type1', 'type2', Etc. Mon but est de filtrer ces dictionnaires en une liste des mêmes dictionnaires mais seulement ceux d'un certain "type". Je pense que je me bats vraiment avec les compréhensions list/dictionary.

donc une liste d'exemple ressemblerait à ceci:

exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]

j'ai une liste de valeurs clés. disons par exemple:

keyValList = ['type2','type3']

où la liste obtenue devrait ressembler à:

expectedResult = [{'type':'type2'},{'type':'type2'},{'type':'type3'}]

Je sais que je pourrais le faire avec un ensemble de boucles for. Je sais qu'il doit y avoir un moyen plus simple cependant. J'ai trouvé beaucoup de saveurs différentes de cette question mais aucune ne correspond vraiment à l'addition et a répondu à la question. Je voudrais poster une tentative de réponse ... mais ils n'étaient pas si impressionnant. probablement préférable de le laisser ouvert. Toute assistance sera grandement appréciée.

41
m25

Vous pouvez essayer une liste comp

>>> exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]
>>> keyValList = ['type2','type3']
>>> expectedResult = [d for d in exampleSet if d['type'] in keyValList]
>>> expectedResult
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]

Une autre méthode consiste à utiliser filter

>>> list(filter(lambda d: d['type'] in keyValList, exampleSet))
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]
78
Bhargav Rao

Utilisez filter ou, si le nombre de dictionnaires dans exampleSet est trop élevé, utilisez ifilter du module itertools. Il renverrait un itérateur, au lieu de remplir la mémoire de votre système avec la liste complète à la fois:

from itertools import ifilter
for elem in ifilter(lambda x: x['type'] in keyValList, exampleSet):
    print elem
15
Saksham Varma