增量嵌套Python字典

2024-09-25 16:28:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望我的问题不会在别处得到回答。我有一个关于递增嵌套字典中的值的问题。这是相关的代码部分。在

import xlrd
import xlsxwriter

workbook = xlrd.open_workbook("sample.xlsx")
rsheet = workbook.sheet_by_index(0)

uniquenames = ["Smith", "Jones", "Mark"]
varlist = ["x", "y", "z"]
var = {}
for x in varlist:
    var[x] = 0
for g in uniquenames:
    namerows[g] = var
p = 1
while p<(rsheet.nrows):
    name = rsheet.cell_value(p, 5)
    n = 11
    if name in uniquenames:
        for varb in varlist:
            namerows[name][varb] += rsheet.cell_value(p,n)
            n+=1
    p+=1

我遇到的问题是Python返回Excel单元格的预期值(rsheet.cell_值(p,n))和嵌套字典值的预期值(namerows[name][varb]),但似乎嵌套字典值的增量是预期值的两倍。这个问题和我有多少字典有关吗?在

^{pr2}$

将上述代码段添加到while循环返回(只是输出的一个示例部分):

726 13861 0.0
726 13862 1.0
728 13863 0.0

我相信这是我自己对Python的错误理解的问题所在,但任何有见识的人都将不胜感激。这段代码的最终目标是为每个名称计算每个变量的总和(每个名称重复多次),类似于透视表在Excel中分组求和/平均值等。提前谢谢。(python 2.7,xlrd 0.9.3)


Tags: 代码nameinimportfor字典varcell
1条回答
网友
1楼 · 发布于 2024-09-25 16:28:16

有一本字典是完全正确的。你的问题在于:

for g in uniquenames:
    namerows[g] = var

对于每个名称,您正在将namerows[name]的值设置为相同的字典对象var。在

所以namerows["Smith"]只是对namerows["Jones"]相同字典的另一个引用。如果您运行namerows["Smith"]["x"] += 1,您将看到您也增加了namerows["Jones"]["x"]。试试看!在

您需要做的是为namerows中的每个键制作一个字典var的副本:

^{pr2}$

注意:现在使用嵌套字典需要注意的一件事是,如果要使用namerows.copy()生成{}的副本,则两个副本中的内部词典将是相同的对象。这叫做浅拷贝。要制作一个深度拷贝,其中内部字典也是副本,您需要import copy并运行new_namerows = copy.deepcopy(namerows)。有关详细信息,请参阅copy module documentation。在

相关问题 更多 >