增加嵌套Python字典

时间:2015-05-28 01:22:27

标签: python dictionary nested increment

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

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

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

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

726 13861 0.0
726 13862 1.0
728 13863 0.0

我确信这是我自己对Python的错误理解,但是任何见解都会受到赞赏。我对此代码的最终目标是为每个名称(每个名称的多次重复)提供每个变量的总和,类似于数据透视表在Excel中对总和/平均值进行分组的方式。提前致谢。 (python 2.7,xlrd 0.9.3)

1 个答案:

答案 0 :(得分:1)

拥有字典词典是完全有效的。你的问题就在这一行:

for g in uniquenames:
    namerows[g] = var

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

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

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

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

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