如何在for循环中创建一个新的字典?

时间:2016-03-06 18:15:05

标签: python python-3.x dictionary

在python 3.5.1中

og_dict = {'name':'user1', 'salary':'1k'}
og_dict_list =[]
for i in range(2,5):
    og_dict['salary'] = str(i)+'k'
    og_dict_list.append(og_dict)
for og_dict_obj in og_dict_list:
    print(og_dict_obj)

以上代码产生以下输出:

{'name': 'user1', 'salary': '4k'}
{'name': 'user1', 'salary': '4k'}
{'name': 'user1', 'salary': '4k'}

但我期待低于输出:

{'name': 'user1', 'salary': '2k'}
{'name': 'user1', 'salary': '3k'}
{'name': 'user1', 'salary': '4k'}

Apparantely python仅修改现有字典,不创建新字典。我该怎么做才能解决这个问题?

是否存在从现有字典对象创建新字典对象的方法? 还有其他更适合这个的系列吗?

2 个答案:

答案 0 :(得分:6)

正如已经指出的那样,你在循环中做什么并不重要:

for ob_dict_obj in ob_dict_list:
    print(ob_dict)    # wrong!

它始终打印ob_dict的值,并且无关紧要放在ob_dict_list中的值。

这就是问题是你修改 唯一字典。您想为每次迭代创建一个新的:

og_dict = {'name':'user1', 'salary':'1k'}
og_dict_list =[]
for i in range(2,5):
    new = og_dict.copy()
    new['salary'] = str(i)+'k'
    og_dict_list.append(new)
for og_dict_obj in og_dict_list:
    print(og_dict_obj)

复制字典有多种方法,例如只需执行dict(of_dict)而不是调用.copy()。但是,AFAIK,没有一种方法可以让你复制&同时更新字典。

然而,此时在循环外og_dict没有多大意义:

og_dict_list =[]
for i in range(2,5):
    og_dict = {'name':'user1', 'salary':str(i) +'k'}
    og_dict_list.append(og_dict)
for og_dict_obj in og_dict_list:
    print(og_dict_obj)

回答更广泛的问题:您正在寻找的行为类型是典型的具有持久数据结构的函数式语言。然而,在具有复制和操作的操作的命令式语言中。更新将是一种通过创建大量不需要的副本来拍摄自己的简单方法。

所有内置投币器的行为与dict相同:更新方法只需修改当前对象,您必须明确复制对象以避免副作用。

答案 1 :(得分:0)

og_dict_list =[]
for i in range(2,5):
    og_dict = {'name':'user1', 'salary':str(i) +'k'}
    og_dict_list.append(og_dict)

for og_dict_obj in og_dict_list:
    print(og_dict_obj)`enter code here

总有一种更好的方法可以做到这一点。您还可以使用Python中的update()方法将新项添加到词典中。