繁体   English   中英

Python 字典只保留最后一次循环的信息

[英]Python dictionary only keeps information from last iteration of loop

我正在尝试创建一个循环以在Series的字典中填充字典:
预期结果是:

{1: {'KEY Mult. by 10': 10, 'KEY Add by 10': 11},
 2: {'KEY Mult. by 10': 20, 'KEY Add by 10': 12},
 3: {'KEY Mult. by 10': 30, 'KEY Add by 10': 13},
 4: {'KEY Mult. by 10': 40, 'KEY Add by 10': 14},
 5: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15}}

我正在做的是:

series_1 = pd.Series([1,2,3,4,5])

first_dict = dict()                         # creating first level of Dict 
second_dict = dict({'KEY Mult. by 10': 0,   # creating second level of Dict
                   'KEY Add by 10': 0})

for i in series_1:
       
    first_dict[i] = second_dict
 
    first_dict[i]['KEY Mult. by 10'] = i *10
    first_dict[i]['KEY Add by 10'] = i + 10

上面的结果最终是:

{1: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
 2: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
 3: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
 4: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
 5: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15}}

然后,当我尝试更改其中一个键的值时,它会更改所有键:

first_dict[3]['KEY Mult. by 10'] = 20

print(first_dict)

{1: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
 2: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
 3: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
 4: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
 5: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15}}

任何人都可以帮助我吗?

一些评论描述了解决方案,但我会详细说明一些。

该字典在每个外部索引中都是 memory 的同一块。 要在运行后查看:

for i in series_1:
    first_dict[i] = second_dict

查看两个内部词典的id() ,这些是 memory 位置:

id(first_dict[1]) # 4511987904
id(first_dict[2])

按照当前编写代码的方式,对任何字典的任何写入都将覆盖所有字典。
在您的机器上,您将有一个(单个)不同的 id 值,但这是相同的想法 - 它们都将位于相同的 memory 位置。

要解决此问题,您可以在 for 循环调用构造函数,它将为每个内部字典分配新的 memory。

for i in series_1:
    first_dict[i] = dict({'KEY Mult. by 10': 0,'KEY Add by 10': 0})
    first_dict[i]['KEY Mult. by 10'] = i * 10
    first_dict[i]['KEY Add by 10'] = i + 10

然后你会看到每个内部字典都有不同的id()返回值,你可以用id()确认它们是不同的 memory 位置:

>>> id(first_dict[3])
4511988352
>>> id(first_dict[1])
4511988160

同样,在您的机器上,这些将是不同的id()值,但想法是相同的,您分别为每个内部字典腾出空间。

first_dict[i] = second_dict更改为: first_dict[i] = dict()它将按预期工作,通过这样做您还可以删除“第二级字典”的创建

问题是,你多次使用同一个字典,你必须使用一个副本哦second_dict

import pandas as pd

series_1 = pd.Series([1, 2, 3, 4, 5])

first_dict = dict()  # creating first level of Dict
second_dict = dict({'KEY Mult. by 10': 0,  # creating second level of Dict
                    'KEY Add by 10': 0})

for i in series_1:
    first_dict[i] = second_dict.copy()

    first_dict[i]['KEY Mult. by 10'] = i * 10
    first_dict[i]['KEY Add by 10'] = i + 10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM