2015-03-12 2 views
0

Я столкнулся с проблемой создания пустых словарей в словарях при использовании fromkeys(); все они связаны с одним и тем же.Использование dict.fromkeys(), присваивает каждому значению пустой словарь

Вот краткий фрагмент кода, чтобы продемонстрировать, что я имею в виду:

a = dict.fromkeys(range(3), {}) 
for key in a: 
    a[key][0] = key 

Выход я хочу, как a[0][0]=0, a[1][0]=1, a[2][0]=2, но все они равны 2, так как это редактирование того же dictionarionary 3 раза

Если Я должен был определить словарь как a = {0: {}, 1: {}, 2: {}}, он работает, но это не очень практично, если вам нужно построить его из большего списка.

С fromkeys, я попытался {}, dict(), dict.copy() и b={}; b.copy(), как бы я идти об этом?

+1

Вместо словаря, проиндексированного целым числом, почему бы и нет списка? – jonrsharpe

+0

Это, честно говоря, не перешло мне в голову, и я, вероятно, мог бы сделать, чтобы быть справедливым ха-ха, хотя для этого потребуется 8 строк вместо 2, поэтому выглядит немного менее аккуратно – Peter

+0

'a = [[i] для i в диапазоне (3)] '? – jonrsharpe

ответ

3

Проблема в том, что {} является единственным значением для fromkeys, а не заводом. Поэтому вы получаете единственный измененный dict, а не отдельные его копии.

defaultdict - один из способов создания диктата с встроенной фабрикой.

from collections import defaultdict as dd 
from pprint import pprint as pp 

a = dd(dict) 
for key in range(3): 
    a[key][0] = key 

pp(a) 

Если вы хотите что-то более строго оценивать, вам нужно будет использовать понимание или карту dict.

a = {key: {} for key in range(3)} 

Но, если вы собираетесь сделать это, вы можете также получить все это сделано

a = {key: {0: key} for key in range(3)} 
+0

Спасибо, поэтому defaultdictionary - это в основном словарь, в котором, когда вы даете ему ключ, этому значению автоматически присваивается новый словарь? – Peter

+0

@Peter да, если значение уже не установлено на этом ключе. – kojiro

1

Просто перебирать ключи и вставить Dict для каждого ключа:

{k: {0: k} for k in keys} 

Здесь keys является итерируемым значениями хеширования, такими как range(3) в вашем примере.

Смежные вопросы