首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向字典中添加新键时,会用新键值覆盖以前存储的所有键。

向字典中添加新键时,会用新键值覆盖以前存储的所有键。
EN

Stack Overflow用户
提问于 2015-02-26 17:40:27
回答 1查看 4.7K关注 0票数 2

我试图使用for循环来生成项目价格的随机值,方法是在预定义的字典中更改项目价格的值。

然后,将这个预定义字典的新值添加到另一个预定义字典的末尾,这样就可以存储价格历史。

这是我的代码:

代码语言:javascript
复制
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的代数,在控制台上生成此输出:

代码语言:javascript
复制
{'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}}

可以看到,前面的值正在被覆盖,我猜对此有一个非常简单的解释,比如“存储不同代值的字典引用了第一个值”,但是我在任何地方都找不到帮助。

有人能解释一下我做错了什么吗。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-26 18:33:41

字典中的键是独一无二的。如果字典中存在一个键,d[key] = other_value只会更改该键的值,它不会创建另一个项。

代码语言:javascript
复制
>>> d = {'a':1, 'b':'foo'}
>>> d['b'] = 'six'
>>> d
{'b': 'six', 'a': 1}
>>> d.update([('a','bar')])
>>> d
{'b': 'six', 'a': 'bar'}
>>>

如果要将数据放在字典中,且数据包含具有多个值的键,则可以将这些值放入每个键的列表中。collections.defaultdict使得这很容易。

代码语言:javascript
复制
>>> 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]})
>>> 

对于您的问题,从列表中的初始值开始,然后添加到其中。

代码语言:javascript
复制
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])
>>>

如何在字典上迭代

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28749143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档