Ma tentative de créer par programmation 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é, toutes sont 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 méthode fromkeys
ne fonctionne-t-elle pas comme prévu?
Passer le second argument de []
À dict.fromkeys()
donne un résultat plutôt inutile - toutes les valeurs du dictionnaire seront l'objet identique.
Dans Python 2.7 ou supérieur, vous pouvez utiliser un système de compréhension dicticaire à la place:
data = {k: [] for k in range(2)}
Dans les versions antérieures de Python, vous pouvez utiliser
data = dict((k, []) for k in range(2))
Utilisez defaultdict à la place:
from collections import defaultdict
data = defaultdict(list)
data[1].append('hello')
De cette façon, vous n'avez pas à initialiser toutes les clés que vous souhaitez utiliser dans les listes à l'avance.
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
afficherait {0: [1, 2], 1: [1, 2]}
.
Vous complétez vos dictionnaires avec des références à une liste unique. 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 une compréhension de liste en Python
d = {k : v for k in blah blah blah}