111 votes

Comment initialiser un dictionnaire de listes vides en Python?

Ma tentative de programmation pour créer un dictionnaire de listes est de ne pas me permettre d'adresser individuellement les clés de dictionnaire. Chaque fois que je créer le dictionnaire de listes et d'essayer d'ajouter un élément, tous sont mis à jour. Voici un simple cas de test:

data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data

Résultat réel: {0: ['hello'], 1: ['hello']}

Résultat attendu: {0: [], 1: ['hello']}

Voici ce qui fonctionne

data = {0:[],1:[]}
data[1].append('hello')
print data

Réels et les résultats Attendus: {0: [], 1: ['hello']}

Pourquoi l' fromkeys méthode ne fonctionne pas comme prévu?

138voto

Sven Marnach Points 133943

Passer [] comme second argument à dict.fromkeys() donne un résultat plutôt inutile - toutes les valeurs du dictionnaire seront le même objet liste.

Dans Python 2.7 ou supérieur, vous pouvez utiliser une compréhension dicitonary à 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))
 

112voto

Martijn Pieters Points 271458

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.

Dans votre exemple, vous utilisez une liste (modifiable):

 alist = [1]
data = dict.fromkeys(range(2), alist)
alist.append(2)
print data
 

produirait {0: [1, 2], 1: [1, 2]} .

10voto

cobie Points 1484

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 Python: créer un dictionnaire avec une compréhension de liste

 d = {k : v for k in blah blah blah}
 

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