簡體   English   中英

增量嵌套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))和嵌套字典值的預期值(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)

擁有字典詞典是完全有效的。 您的問題在這一行:

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.copy()來復制namerows ,則內部字典在兩個副本中將是相同的對象。 這稱為淺表副本 要制作內部詞典也是副本的深層副本,您需要import copy並運行new_namerows = copy.deepcopy(namerows) 有關更多信息,請參見復制模塊文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM