Ma tentative de créer par programme un dictionnaire de listes ne me permet pas d'adresser individuellement les clés de dictionnaire. Chaque fois que je crée le dictionnaire de listes et que j'essaie d'ajouter une clé, elles sont toutes mises à jour. Voici un cas de test très simple:
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data
Résultat actuel: {0: ['hello'], 1: ['hello']}
Résultat attendu: {0: [], 1: ['hello']}
Voici ce qui fonctionne
data = {0:[],1:[]}
data[1].append('hello')
print data
Résultat réel et attendu: {0: [], 1: ['hello']}
Pourquoi la fromkeys
méthode ne fonctionne-t-elle pas comme prévu?
la source
fromkeys()
méthode accepte une fonction de fabrique à la place, afin que nous puissions passer enlist
tant que fonction, et cette fonction serait appelée une fois pour chaque clé créée, mais ce n'est pas l'API réelle dedict.fromkeys()
.Utilisez à la place defaultdict :
from collections import defaultdict data = defaultdict(list) data[1].append('hello')
De cette façon, vous n'avez pas à initialiser au préalable toutes les touches que vous souhaitez utiliser pour les listes.
Ce qui se passe dans votre exemple, c'est que vous utilisez une liste (mutable):
alist = [1] data = dict.fromkeys(range(2), alist) alist.append(2) print data
produirait
{0: [1, 2], 1: [1, 2]}
.la source
list
ici ce n'est pas une liste vide, mais un type (ou vous pouvez le voir comme un constructeur appelable, je suppose). Ainsi, chaque fois qu'une clé manquante est transmise, une nouvelle liste est créée au lieu de réutiliser la même.Vous remplissez vos dictionnaires avec des références à une seule liste. Ainsi, lorsque vous la mettez à jour, la mise à jour est reflétée sur toutes les références. Essayez plutôt une compréhension du dictionnaire. Voir Créer un dictionnaire avec compréhension de liste en Python
d = {k : v for k in blah blah blah}
la source
v
contient cette réponse?Vous pouvez utiliser ceci:
data[:1] = ['hello']
la source