向字典添加新键会用新键值覆盖所有以前存储的键
Adding new key to dictionary overwrites all previously stored keys with new keys values
我正在尝试使用 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}}
可以看出,以前的值正在被覆盖,我猜对此有一个非常简单的解释,例如 "the dictionary storing the different generation values is referencing the first one for its values",但我在任何地方都找不到关于这个问题的帮助。
所以有人可以向我解释我做错了什么吗。
字典中的键是唯一的。如果字典中存在某个键,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])
>>>
我正在尝试使用 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}}
可以看出,以前的值正在被覆盖,我猜对此有一个非常简单的解释,例如 "the dictionary storing the different generation values is referencing the first one for its values",但我在任何地方都找不到关于这个问题的帮助。
所以有人可以向我解释我做错了什么吗。
字典中的键是唯一的。如果字典中存在某个键,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])
>>>