445 votes

Compréhension du dictionnaire python

Est-il possible de créer un dictionnaire de compréhension en Python (pour les touches)?

Sans interprétations de la liste, vous pouvez utiliser quelque chose comme ceci:

l = []
for n in range(1, 11):
    l.append(n)

On peut la réduire à une compréhension de liste: l = [n for n in range(1, 11)].

Cependant, dire que j'ai envie de mettre un dictionnaire clés à la même valeur. Je peux faire:

d = {}
for n in range(1, 11):
     d[n] = True # same value for each

J'ai essayé ceci:

d = {}
d[i for i in range(1, 11)] = True

Cependant, je reçois un SyntaxError sur le for.

En plus (je n'ai pas besoin de cette partie, mais juste vous demandez-vous), pouvez-vous définir un dictionnaire clés pour un tas de différentes valeurs, comme ceci:

d = {}
for n in range(1, 11):
    d[n] = n

Est-ce possible avec un dictionnaire de compréhension?

d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]

Cela soulève également un SyntaxError sur le for.

Merci!

578voto

BrenBarn Points 63718

Il y a de dictionnaire des inclusions en Python 2.7+, mais ils ne fonctionnent pas tout à fait la façon dont vous essayez. Comme une compréhension de liste, ils créent un nouveau dictionnaire; vous ne pouvez les utiliser pour ajouter des clés à un dictionnaire. Aussi, vous devez spécifier les clés et les valeurs, même si bien sûr, vous pouvez spécifier une valeur factice si vous le souhaitez.

>>> d = {n: n**2 for n in range(5)}
>>> print d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Si vous voulez les mettre ensemble pour de Vrai:

>>> d = {n: True for n in range(5)}
>>> print d
{0: True, 1: True, 2: True, 3: True, 4: True}

Ce que vous semblez demander est une façon de définir plusieurs touches à la fois sur un dictionnaire. Il n'y a pas de raccourci directe. Vous pouvez boucle comme vous l'a montré, ou vous pouvez utiliser un dictionnaire, la compréhension de créer un nouveau dict avec les nouvelles valeurs, puis effectuez l' oldDict.update(newDict) de fusionner les nouvelles valeurs dans le vieux dict.

156voto

mgilson Points 92954

Vous pouvez utiliser l' dict.fromkeys méthode de la classe ...

>>> dict.fromkeys(range(1, 11), True)
{1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True, 10: True}

C'est le moyen le plus rapide pour créer un dictionnaire où toutes les clés de la carte de la même valeur.

Soyez prudent en utilisant ce avec des objets mutables:

d = dict.fromkeys(range(10), [])
d[1].append(2)
print(d[2])  # ???

Si vous n'avez pas réellement besoin d'initialiser toutes les clés, defaultdict pourrait être utile également:

from collections import defaultdict
d = defaultdict(lambda: True)

Pour répondre à la deuxième partie, une dict-de la compréhension, c'est juste ce dont vous avez besoin:

{k: k for k in range(10)}

Ou pour python2.6:

dict((k, k) for k in range(10))

Vous pouvez également créer un astucieux sous-classe de dict qui fonctionne un peu comme un defaultdict si vous substituez __missing__:

>>> class KeyDict(dict):
...    def __missing__(self, key):
...       #self[key] = key  # Maybe add this also??? 
...       return key
... 
>>> d = KeyDict()
>>> d[1]
1
>>> d[2]
2
>>> d[3]
3
>>> print(d)
{}

Neat.

32voto

NPE Points 169956
>>> {i:i for i in range(1, 11)}
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10}

13voto

Bryan Moyles Points 3881

Utiliser dict() sur une liste de tuples, cette solution vous permettra d’avoir des valeurs arbitraires dans chaque liste, pour autant qu’ils sont de même longueur

11voto

Bonifacio2 Points 756

Le but principal d'une compréhension de liste est de créer une nouvelle liste basée sur une autre sans changer ou de détruire l'original de la liste.

Au lieu d'écrire

    l = []
    for n in range(1, 11):
        l.append(n)

ou

    l = [n for n in range(1, 11)]

vous devez écrire uniquement

    l = range(1, 11)

Dans les deux premiers blocs de code que vous êtes en train de créer une nouvelle liste, le parcours et il suffit de retourner chaque élément. C'est juste un moyen coûteux de créer une liste de copie.

Pour obtenir un nouveau dictionnaire avec toutes les touches de la même valeur en fonction d'une autre dict, faites ceci:

    old_dict = {'a': 1, 'c': 3, 'b': 2}
    new_dict = { key:'your value here' for key in old_dict.keys()}

Vous êtes de la réception d'un SyntaxError parce que quand vous écrivez

    d = {}
    d[i for i in range(1, 11)] = True

il s'agit de dire: "ma clé" i for i in range(1, 11) "pour de Vrai" et le "i for i in range(1, 11)" n'est pas une clé valide, c'est juste une erreur de syntaxe. Si dicts listes prises en charge comme les clés, vous devez faire quelque chose comme

    d[[i for i in range(1, 11)]] = True

et pas

    d[i for i in range(1, 11)] = True

mais les listes ne sont pas hashable, de sorte que vous ne pouvez pas les utiliser comme dict clés.

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