Est-il possible de créer une compréhension de dictionnaire en Python (pour les clés)?
Sans compréhension de liste, vous pouvez utiliser quelque chose comme ceci:
l = []
for n in range(1, 11):
l.append(n)
Nous pouvons raccourcir ce à une compréhension de la liste: l = [n for n in range(1, 11)]
.
Supposons toutefois que je souhaite définir les clés d'un dictionnaire sur la même valeur. Je peux faire:
d = {}
for n in range(1, 11):
d[n] = True # same value for each
J'ai essayé ça:
d = {}
d[i for i in range(1, 11)] = True
Cependant, j'obtiens un SyntaxError
sur le for
.
De plus (je n'ai pas besoin de cette partie, mais je me demande simplement), pouvez-vous définir les clés d'un dictionnaire sur un tas de valeurs différentes, comme ceci:
d = {}
for n in range(1, 11):
d[n] = n
Est-ce possible avec une compréhension du dictionnaire?
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
.
python
dictionary
list-comprehension
Rushy Panchal
la source
la source
Réponses:
Il existe des compréhensions de dictionnaire dans Python 2.7+ , mais elles ne fonctionnent pas exactement comme vous essayez. Comme une compréhension de liste, ils créent un nouveau dictionnaire; vous ne pouvez pas les utiliser pour ajouter des clés à un dictionnaire existant. En outre, vous devez spécifier les clés et les valeurs, bien que vous puissiez bien sûr spécifier une valeur fictive si vous le souhaitez.
Si vous souhaitez les définir tous sur True:
Ce que vous semblez demander, c'est un moyen de définir plusieurs clés à la fois sur un dictionnaire existant. Il n'y a pas de raccourci direct pour cela. Vous pouvez soit boucler comme vous l'avez déjà montré, soit utiliser une compréhension du dictionnaire pour créer un nouveau dict avec les nouvelles valeurs, puis faire
oldDict.update(newDict)
pour fusionner les nouvelles valeurs dans l'ancien dict.la source
dict.update
peut également accepter un itérable de paires clé-valeur, tout comme ledict
constructeurdict.fromkeys()
. Donc, pour définir toutes les valeurs surTrue
, utilisezdict.fromkeys(range(5), True)
. Attention, la valeur n'est pas copiée , vous pouvez donc éviter cela lorsque vous avez une valeur modifiable; il sera partagé entre toutes les clés.{ n*2 : n for n in range(3) } => {0: 0, 2: 1, 4: 2}
. Les deux peuvent se faire dans la même expression:{ n*2 : n*3 for n in range(3) } => { 0: 0, 2: 3, 4: 6 }
.Vous pouvez utiliser la
dict.fromkeys
méthode de classe ...C'est le moyen le plus rapide de créer un dictionnaire où toutes les clés correspondent à la même valeur.
Mais ne l' utilisez pas avec des objets mutables :
Si vous n'avez pas réellement besoin d'initialiser toutes les clés, un
defaultdict
pourrait également être utile:Pour répondre à la deuxième partie, une compréhension du dict est exactement ce dont vous avez besoin:
Vous ne devriez probablement pas faire cela, mais vous pouvez également créer une sous-classe
dict
qui fonctionne un peu commedefaultdict
si vous remplacez__missing__
:la source
d = defaultdict(lambda: True)
, le lambda n'est pas requis car True est (ou ne devrait pas) être mutable.la source
J'aime vraiment le commentaire @mgilson, car si vous avez deux itérables, l'un qui correspond aux clés et l'autre aux valeurs, vous pouvez également faire ce qui suit.
donnant
la source
{i:j for i in keys for j in values}
Utilisez dict () sur une liste de tuples, cette solution vous permettra d'avoir des valeurs arbitraires dans chaque liste, tant qu'elles sont de la même longueur
la source
d = dict(zip(i_s,x_s))
Considérez cet exemple de comptage de l'occurrence de mots dans une liste en utilisant la compréhension du dictionnaire
Et le résultat est
la source
Le but principal d'une compréhension de liste est de créer une nouvelle liste basée sur une autre sans changer ou détruire la liste d'origine.
Au lieu d'écrire
ou
vous ne devez écrire que
Dans les deux blocs de code supérieurs, vous créez une nouvelle liste, parcourez-la et retournez simplement chaque élément. C'est juste un moyen coûteux de créer une copie de liste.
Pour obtenir un nouveau dictionnaire avec toutes les clés définies sur la même valeur en fonction d'un autre dict, procédez comme suit:
Vous recevez une erreur de syntaxe car lorsque vous écrivez
vous dites essentiellement: "Définir ma clé 'i pour i dans la plage (1, 11)' sur True" et "i pour i dans la plage (1, 11)" n'est pas une clé valide, c'est juste une erreur de syntaxe. Si dict les listes prises en charge comme clés, vous feriez quelque chose comme
et pas
mais les listes ne sont pas hachables, vous ne pouvez donc pas les utiliser comme clés dict.
la source
vous ne pouvez pas hacher une liste comme ça. essayez ceci à la place, il utilise des tuples
la source