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