Добавление нового ключа в словарь перезаписывает все ранее сохраненные ключи новыми значениями ключей.

Я пытаюсь использовать цикл for для генерации случайных значений цен на товары, изменяя значение цен на товары в предварительно определенном словаре.

Новые значения этого предопределенного словаря затем добавляются в конец другого предопределенного словаря, чтобы можно было сохранить историю цен.

вот мой код:

tradable_good_prices= {'iron' : 0, 'gold' : 0, 'lead' : 0, 'ruby' : 0 'emerald' : 0, 'steel' : 0, 'diamond' : 0} 
item_list = tradable_good_prices.keys() 
item_price_history = {}

def Random_economy(generations):

    for generation_number in range(0, generations): 

        for list_number in range(0, len(item_list)): 

            tradable_good_prices[item_list[list_number]] = np.random.random_integers(100,1000) 

        print(tradable_good_prices)

        item_price_history[generation_number] = tradable_good_prices 

        print(item_price_history)

Random_economy(2)

код принимает поколения в качестве аргумента количества итераций цикла for. И используя значение 2 для поколений, этот вывод создается на консоли:

{'steel': 821, 'diamond': 477, 'lead': 325, 'gold': 914, 'iron': 542, 'emerald': 360, 'ruby': 705}

{0: {'steel': 821, 'diamond': 477, 'lead': 325, 'gold': 914, 'iron': 542, 'emerald': 360, 'ruby': 705}}

{'steel': 751, 'diamond': 158, 'lead': 322, 'gold': 662, 'iron': 180, 'emerald': 846, 'ruby': 570}

{0: {'steel': 751, 'diamond': 158, 'lead': 322, 'gold': 662, 'iron': 180, 'emerald': 846, 'ruby': 570}, 1: {'steel': 751, 'diamond': 158, 'lead': 322, 'gold': 662, 'iron': 180, 'emerald': 846, 'ruby': 570}}

Как видно, предыдущие значения перезаписываются, я предполагаю, что это довольно простое объяснение, например, «словарь, хранящий значения разных поколений, ссылается на первый для своих значений», но я нигде не могу найти помощи по этому вопросу.

Так может кто-нибудь, пожалуйста, объясните мне, что я делаю неправильно.


person user2966742    schedule 26.02.2015    source источник
comment
Я предполагаю, что это должно было ссылаться на старый словарь для каждого ключа, так как я исправил это сейчас, введя новый словарь в первом цикле for. Однако, если кто-то все еще может объяснить мне, почему словари работают таким образом, это было бы здорово.   -  person user2966742    schedule 26.02.2015
comment
Значения словаря - это просто отдельные числа. На каждой итерации вы меняете значения. Если вы хотите создать историю, вам нужно поместить цены в контейнер, например список.   -  person wwii    schedule 26.02.2015
comment
Возможный дубликат создать словарь с дубликатами ключей в python   -  person wwii    schedule 13.07.2018


Ответы (1)


Ключи в словаре уникальны. Если ключ существует в словаре, d[key] = other_value просто изменяет значение для этого ключа, а НЕ создает новый элемент.

>>> d = {'a':1, 'b':'foo'}
>>> d['b'] = 'six'
>>> d
{'b': 'six', 'a': 1}
>>> d.update([('a','bar')])
>>> d
{'b': 'six', 'a': 'bar'}
>>>

Если у вас есть данные, которые вы хотите поместить в словарь, и данные содержат ключи с несколькими значениями, вы можете поместить значения в список для каждого ключа. collections.defaultdict делает это легко.

>>> a
[('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('a', 100), ('c', 99), ('d', 98), ('f', 97)]
>>> import collections
>>> d = collections.defaultdict(list)
>>> for key, value in a:
    d[key].append(value)

>>> d
defaultdict(<class 'list'>, {'b': [1], 'a': [0, 100], 'e': [4], 'f': [5, 97], 'd': [3, 98], 'c': [2, 99]})
>>> 

Для вашей проблемы начните с начальных значений в списке, а затем добавьте к ним.

import random

d = {'a':[0], 'b':[0], 'c':[0]}
for _ in xrange(4):
    for key in d:
        d[key].append(random.randint(1, 100))

for item in d.items():
    print item

>>>
('a', [0, 92, 45, 52, 32])
('c', [0, 51, 85, 72, 4])
('b', [0, 47, 7, 74, 59])
>>>

Как перебирать словарь.

person wwii    schedule 26.02.2015