Python:迭代嵌套字典时的冗余

标签 python excel dictionary tree iteration

我有一个嵌套字典,我试图循环它以写入 excel 文件。

这是启动和创建嵌套字典的代码

def tree(): return defaultdict(tree)
KMstruct = tree()
for system in sheet.columns[0]:
if system.value not in KMstruct:
    KMstruct[system.value]
    for row in range(1,sheet.get_highest_row()+1):
        if sheet['A'+str(row)].value == system.value and sheet['B'+str(row)].value not in KMstruct:
            KMstruct[system.value][sheet['B'+str(row)].value]
            if sheet['B'+str(row)].value == sheet['B'+str(row)].value and sheet['C'+str(row)].value not in KMstruct:
                KMstruct[system.value][sheet['B'+str(row)].value][sheet['C'+str(row)].value]
                if sheet['C'+str(row)].value == sheet['C'+str(row)].value and sheet['D'+str(row)].value not in KMstruct:
                    KMstruct[system.value][sheet['B'+str(row)].value][sheet['C'+str(row)].value][sheet['D'+str(row)].value]
                    KMstruct[system.value][sheet['B'+str(row)].value][sheet['C'+str(row)].value][sheet['D'+str(row)].value] = [sheet['E'+str(row)].value]

这是我循环的代码:
for key in KMstruct.keys():
r += 1
worksheet.write(r, col,     key)
for subkey in KMstruct[key]:
    if currsubkeyval != subkey:
        r += 1
        worksheet.write(r, col,     key)
    r +=1
    worksheet.write(r, col, key + '\\' + subkey)
    for item in KMstruct[key][subkey]:
        if curritemval != item:
            r +=1
            worksheet.write(r, col, key + '\\' + subkey)
        for subitem in KMstruct[key][subkey][item]:
            r += 1
            worksheet.write(r, col, key + '\\' + subkey + '\\' + item)
            worksheet.write(r, col + 1, subitem)
            curritemval = item
            for finalitem in KMstruct[key][subkey][item][subitem]:
                r += 1
                worksheet.write(r, col, key + '\\' + subkey + '\\' + item + '\\' + subitem)
                worksheet.write(r, col + 1, KMstruct[key][subkey][item][subitem])

由于我是菜鸟,请耐心等待这段代码,我知道这不是那么漂亮。无论如何,我的问题是最后一个循环。我正在尝试获取 KMstruct[key][subkey][item][subitem] 中的字符串值但是循环变量 lastitem遍历键的字符串值的每个字符(注意:键 subitem 包含字符串列表)。这意味着如果我只有一个要写入的值,它会被写入与字符串中的字符一样多的次数。

E.g.: value: apple 将在新的 excel 行上写入 5 次

我在这里做错了什么?

编辑:关于冗余的问题已经解决,但现在我需要了解在将我的最后一项(即我的字符串列表)分配给子项键时是否做错了什么。

最佳答案

问题在于 Python 中的 str也是一个可迭代的,例如:

>>> for s in 'hello':
...    print(s)

h
e
l
l
o

因此,当值为 str 时,您要么需要避免迭代。 , 或包装 str在另一个可迭代的(例如 list )中,以便可以以相同的方式处理它。这会因您构建代码的方式而变得有些困难。例如,以下内容:
for key in KMstruct.keys():
    for subkey in KMstruct[key]:

...可以写成:
for key, value in KMstruct.items():
    for subkey, subvalue in value.items():

...为您提供每个循环的值,从而可以应用测试。
for key, val in KMstruct.items():
r += 1
worksheet.write(r, col,     key)

for subkey, subval in val.items():
    if currsubkeyval != subkey:
        r += 1
        worksheet.write(r, col,     key)
    r +=1
    worksheet.write(r, col, key + '\\' + subkey)

    for item, itemval in subval.items():
        if curritemval != item:
            r +=1
            worksheet.write(r, col, key + '\\' + subkey)

        for subitem, subitemval in itemval.items():
            r += 1
            worksheet.write(r, col, key + '\\' + subkey + '\\' + item)
            worksheet.write(r, col + 1, subitem)
            curritemval = item

            # I am assuming at this point subitemval is either a list or a str?
            if type(subitemval) == str:
                # If it is, wrap it as a list, so the next block works as expected
                subitemval = [subitemval] 

            for finalitem in subitemval:
                r += 1
                worksheet.write(r, col, key + '\\' + subkey + '\\' + item + '\\' + subitem)
                worksheet.write(r, col + 1, finalitem) # This should be finalitem, correct?

这里我们测试subitemval的类型如果是 str将其包装在列表中 [str]所以下面的 block 按预期迭代。还有一个明显的错误,您没有输出 finalitem在最后一行。如果没有您的示例数据,就不可能对此进行测试,但它应该在功能上是等效的。

关于Python:迭代嵌套字典时的冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34786021/

相关文章:

javascript - 在 ESLint 中替换按位运算

python - 更高效的 HashMap (Dictionary) for Python 用于大数据

python - 有效的数据结构可以在 Pandas 中保持按时间键控的类似字典的观察结果?

python - 如何使用 python 的标准库 zipfile 检查 zip 文件是否加密?

javascript - 通过 Excel VBA 调用 javascript 文件 (.js)?

VBA - 如果单元格包含某个值而不是等于或不等于,则复制值

java - 嵌套映射或相当于存储三元组

python - 如何根据索引和值有效更新 np 数组?

python - 在 python 中,每次调用 subprocess.call 都会产生一个单独的子进程吗?

excel - 将 "##h ##m"转换为 ##.## 小时