375 votes

Extraire un sous-ensemble de paires clé-valeur du dictionnaire ?

J'ai un gros objet dictionnaire qui possède plusieurs paires clé-valeur (environ 16), mais je ne suis intéressé que par 3 d'entre elles. Quel est le meilleur moyen (le plus court/efficace/le plus élégant) d'y parvenir ?

Le meilleur que je connaisse est :

bigdict = {'a':1,'b':2,....,'z':26} 
subdict = {'l':bigdict['l'], 'm':bigdict['m'], 'n':bigdict['n']}

Je suis sûr qu'il existe une méthode plus élégante que celle-ci.

501voto

Mark Longair Points 93104

Vous pouvez essayer :

dict((k, bigdict[k]) for k in ('l', 'm', 'n'))

... ou dans Python 3 Python version 2.7 ou ultérieure (merci à Fábio Diniz pour avoir signalé que cela fonctionne aussi en 2.7) :

{k: bigdict[k] for k in ('l', 'm', 'n')}

Mise à jour : Comme Håvard S fait remarquer, je suppose que vous savez que les clés seront dans le dictionnaire - cf. sa réponse si vous n'êtes pas en mesure de faire cette supposition. Par ailleurs, comme timbo fait remarquer dans les commentaires, si vous voulez une clé qui est manquante dans bigdict à mettre en correspondance avec None que vous pouvez faire :

{k: bigdict.get(k, None) for k in ('l', 'm', 'n')}

Si vous utilisez Python 3, et que vous uniquement vous voulez des clés dans le nouveau dict qui existent réellement dans l'original, vous pouvez utiliser le fait de visualiser des objets mettre en œuvre certaines opérations d'ensemble :

{k: bigdict[k] for k in bigdict.keys() & {'l', 'm', 'n'}}

6 votes

Échouera si bigdict ne contient pas k

0 votes

@Håvard S : Je pense que d'après le post de l'OP, nous pouvons supposer que tous les éléments donnés sont dans la base de données de l'OP. bigdict .

0 votes

"ou dans Python 3" ou "ou dans Python >= 2.7" ?

132voto

Håvard S Points 11152

Un peu plus court, au moins :

wanted_keys = ['l', 'm', 'n'] # The keys you want
dict((k, bigdict[k]) for k in wanted_keys if k in bigdict)

8 votes

+1 pour un comportement alternatif consistant à exclure une clé si elle n'est pas dans bigdict plutôt que de lui attribuer la valeur None.

1 votes

Alternativement : dict((k,bigdict.get(k,defaultVal) for k in wanted_keys) si vous devez avoir toutes les clés.

4 votes

Cette réponse est sauvée par un "t".

28voto

theheadofabroom Points 1931
interesting_keys = ('l', 'm', 'n')
subdict = {x: bigdict[x] for x in interesting_keys if x in bigdict}

0 votes

@loutre comment proposez-vous de vous assurer que vous extrayez toutes les données pour les clés données ?

1 votes

Désolé, j'ai fait une erreur. Je pensais que vous boucliez sur "bigdict". C'est ma faute. Je supprime mon commentaire

7voto

phimuemue Points 11644

Peut-être :

subdict=dict([(x,bigdict[x]) for x in ['l', 'm', 'n']])

Python 3 prend même en charge les éléments suivants :

subdict={a:bigdict[a] for a in ['l','m','n']}

Notez que vous pouvez vérifier l'existence dans le dictionnaire comme suit :

subdict=dict([(x,bigdict[x]) for x in ['l', 'm', 'n'] if x in bigdict])

resp. pour python 3

subdict={a:bigdict[a] for a in ['l','m','n'] if a in bigdict}

0 votes

Échec si a n'est pas dans bigdict

0 votes

Les choses qui sont censées ne fonctionner que dans python 3, fonctionnent également dans 2.7

6voto

onkel Points 35

Vous pouvez également utiliser map (qui est un très fonction utile à connaître de toute façon) :

sd = dict(map(lambda k: (k, l.get(k, None)), l))

Exemple :

large_dictionary = {'a1':123, 'a2':45, 'a3':344}
list_of_keys = ['a1', 'a3']
small_dictionary = dict(map(lambda key: (key, large_dictionary.get(key, None)), list_of_keys))

PS : J'ai emprunté le .get(key, None) d'une réponse précédente :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X