增量嵌套 Python 字典

Increment Nested Python Dictionary

我希望我的问题没有在其他地方得到解答。我有一个关于递增嵌套字典中的值的问题。这是代码的相关部分。

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_value(p,n)) 的预期值和嵌套字典的预期值values (namerows[name][varb]),但似乎将嵌套字典值递增到预期数量的两倍。这个问题和我的词典数量有关吗?

print namerows["Smith"]["x"], p, rsheet.cell_value(p, 12)

将上面的代码片段添加到 while 循环 returns(只是输出的示例部分):

726 13861 0.0
726 13862 1.0
728 13863 0.0

我确定这是我自己对 Python 问题的理解有误,但任何见解都将不胜感激。我使用此代码的最终目标是得出每个名称的每个变量的总和(每个名称重复多次),类似于数据透视表在 Excel 中对 sums/averages 等进行分组的方式。提前致谢。 (python 2.7, xlrd 0.9.3)

拥有一本字典的字典是完全有效的。您的问题出在这一行:

for g in uniquenames:
    namerows[g] = var

对于每个名称,您将 namerows[name] 的值设置为 same 字典对象 var.

所以 namerows["Smith"] 只是对与 namerows["Jones"] 相同的词典的另一种引用。如果你 运行 namerows["Smith"]["x"] += 1,你会看到你也增加了 namerows["Jones"]["x"]。试试吧!

您需要做的是为 namerows 中的每个键复制字典 var

for g in uniquenames:
    namerows[g] = var.copy()

警告:现在使用嵌套字典要注意的一件事是,如果您想使用 namerows.copy() 制作 namerows 的副本,内部字典将是两个副本中的相同对象.这称为浅拷贝。要制作深拷贝,内部字典也是拷贝,你需要import copy和运行new_namerows = copy.deepcopy(namerows)。有关详细信息,请参阅 copy module documentation