web-dev-qa-db-fra.com

Comment initialiser un dictionnaire de listes vides en Python?

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?

76
Martin Burch

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))
89
Sven Marnach

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]}.

66
Martijn Pieters

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}
6
cobie