У меня есть его очень простой словарь, который называется mydict. Я перебираю его и устанавливаю новые вложенные ключи. По какой-то причине каждый родительский ключ устанавливается на каждой итерации. Каждый ключ random должен иметь случайное число. Кажется, с этим dict.fromkeys(myset, {}) возникает некоторая проблема, как будто я жестко его кодирую, тогда все выглядит хорошо. Я пытался copy и deepcopy без удачи.

import random
myset = ['A', 'B', 'C']
mydict = dict.fromkeys(myset, {})
for k, v in mydict.items():
    mydict[k]['random'] = random.random()
print mydict

Вывод выглядит так:

{'A': {'random': 0.09458900537947934}, 'C': {'random': 0.09458900537947934}, 'B': {'random': 0.09458900537947934}}
1
user2242044 6 Июл 2019 в 22:39

3 ответа

Лучший ответ

Вы можете инициализировать ваш mydict с помощью кортежа, состоящего из ключей и значений:

import random

myset = ['A', 'B', 'C']
mydict = dict(zip(myset, iter(lambda: {}, None)))

for k, v in mydict.items():
    mydict[k]['random'] = random.random()

print(mydict)

Печать :

{'A': {'random': 0.17573941764965995}, 'B': {'random': 0.7591872462452937}, 'C': {'random': 0.6027577677034227}}
1
Andrej Kesely 6 Июл 2019 в 19:48

Попробуй это:

import random

myset = ['A', 'B', 'C']

mydict = {}

for k in myset:
    temp = {'random':random.random()}
    mydict[k] = temp

print (mydict)

Проще сделать пустой дикт и затем заполнить его

Выход:

{'A': {'random': 0.8487768382668905}, 'B': {'random': 0.3199770033314223}, 'C': {'random': 0.9574897543475179}}
1
okawo 6 Июл 2019 в 19:50

Причина, по которой вы наблюдаете поведение, заключается в том, что вы вызываете функцию dict.fromkeys, которая принимает значение (пустой объект словаря в вашем случае) и присваивает его каждому ключу. Таким образом, все ваши ключи в mydict указывают на одинаковое значение (словарь). Для каждого ключа в цикле for вы обновляете один и тот же словарь новым и новым random ключом. Если вы хотите увидеть больше, сделайте:

for k, v in mydict.items():
  print('%s %s' % (k, id(v)))

Вы увидите, что каждое значение в вашем словаре mydict является точно таким же. Для рабочего кода попробуйте @okawo answer.

0
Radosław Cybulski 6 Июл 2019 в 20:00