python - 从列表生成嵌套字典

标签 python python-3.x dictionary

我想在 python3 中填充嵌套字典,但我不知道如何干净地做到这一点。我想要一个按以下方式工作的更新函数:

#pseudo code for the update given One and Two:
One = ('W/X/Y/Z.py', 1, 8)
Two = ('A/B/C/D.py', 12, 42)

#blank initialization
Dict = dict()

#structure gets created based on the path in Two
def updateDict(One, Two):
    tuple = (1, 8, 12, 42)
    try:
        Dict["A"]["B"]["C"]["D.py"]['W/X/Y/Z.py'].append(tuple)
    except:
        Dict["A"]["B"]["C"]["D.py"]['W/X/Y/Z.py'] = [tuple]
#where:
#Dict["A"] is now a dict, 
#Dict["A"]["B"] is now a dict, 
#Dict["A"]["B"]["C"] is now a dict and 
#Dict["A"]["B"]["C"]["D.py"] is now a dict
#Dict["A"]["B"]["C"]["D.py"]["W/X/Y/Z.py"] is now a list of tuples with four values

Iteratively given
One = ('W/X/Y/Z.py', 1, 8)
Two = ('A/B/C/D.py', 12, 42)

One = ('W/X/Y/Z.py', 50, 60)
Two = ('A/B/C/D.py', 90, 100)

One = ('W/X/Y/NOTZ.py', 3, 14)
Two = ('A/B/C/D.py', 15, 22)

One = ('W/X/Y/Z.py', 14, 62)
Two = ('A/B/C/NOTD.py', 13, 56)
#Would produce the following structure:
Dict = 
{"A":   {
        "B":    {
                "C":    {
                        "D.py": {
                                "W/X/Y/Z.py" : [(1,8,12,42), (50,60,90,100)],
                                "W/X/Y/NOTZ.py" : [(3,14,15,22)]
                        },
                        "NOTD.py": {
                                "W/X/Y/Z.py" : [(14,62,13,56)]
                        }
                }
        }
}}
This can be made using the following commands:
Dict = dict()
Dict["A"] = dict()
Dict["A"]["B"] = dict()
Dict["A"]["B"]["C"] = dict()
Dict["A"]["B"]["C"]["D.py"] = dict()
Dict["A"]["B"]["C"]["D.py"]["W/X/Y/Z.py"] = [(1,8,12,42), (50,60,90,100)]
Dict["A"]["B"]["C"]["D.py"]["W/X/Y/NOTZ.py"] = [(3,14,15,22)]
Dict["A"]["B"]["C"]["NOTD.py"] = dict()
Dict["A"]["B"]["C"]["NOTD.py"]["W/X/Y/Z.py"] = [(14,62,13,56)]

所以 Dict["A"]["B"]["C"] 将返回一个字典:

dict(
    "D.py": {
        "W/X/Y/Z.py" : [(1,8,12,42), (50,60,90,100)],
        "W/X/Y/NOTZ.py" : [(3,14,15,22)]
     },
    "NOTD.py": {
        "W/X/Y/Z.py" : [(14,62,13,56)]
    }
)

而 Dict["A"]["B"]["C"]["D.py"] 将返回一个字典:

dict(
    "W/X/Y/Z.py" : [(1,8,12,42), (50,60,90,100)],
    "W/X/Y/NOTZ.py" : [(3,14,15,22)]
)

和 Dict["A"]["B"]["C"]["D.py"]["W/X/Y/Z.py"] 将返回元组列表:

[(1,8,12,42), (50,60,90,100)]

因此所有嵌套值都是字典,但所有叶子都是元组列表。

“一”和“二”中的字符串中的路径在以文件名结尾之前都可以是任意长度和值(因此您可以获得 W/X/Y/Z.py 或 W/X/AA.py 或 Q/R/S/T/U/V.py)。

任何可能对此有所帮助的软件包将不胜感激。

最佳答案

这是 updateDict() 的一个版本,它可以完成您想要的操作(注意:Py3)。它使用指针 d 进入任意深度字典,然后将元组附加到该指针:

Dict = dict()

def updateDict(One, Two):
    k, *v1 = One
    path, *v2 = Two
    d = Dict
    for p in path.split('/'):
        d = d.setdefault(p, {})
    d.setdefault(k, []).append(tuple(v1+v2))

In []:
One = ('W/X/Y/Z.py', 1, 8)
Two = ('A/B/C/D.py', 12, 42)
updateDict(One, Two)
Dict

Out[]:
{'A': {'B': {'C': {'D.py': {'W/X/Y/Z.py': [(1, 8, 12, 42)]}}}}}

In []:
One = ('W/X/Y/Z.py', 50, 60)
Two = ('A/B/C/D.py', 90, 100)
updateDict(One, Two)
Dict

Out[]:
{'A': {'B': {'C': {'D.py': {'W/X/Y/Z.py': [(1, 8, 12, 42), (50, 60, 90, 100)]}}}}}

等等...

关于python - 从列表生成嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55252567/

相关文章:

python - wxPython:有没有办法改变wx.ScrolledWindow中滚动条的颜色?

python - python中的udp速率限制?

python - ModelForm 的 save 方法中的 Django admin.py : save_model() is not called by model. save()

python - 如何禁用输入输入直到双击?

python - 如何将 Celery 与 asyncio 结合使用?

python - 用@property 注释的方法的类型提示

arrays - Swift 3/4 - 仅在所需的 tableView 单元格中填充数据

python +安全

python - 有效地在字典列表中查找值

python - 如何将文本文件内容转换为字典