将表转换为分层字典?

Chr*_*Cox 7 python dictionary nested

我有一张表格:

A1, B1, C1, (value)
A1, B1, C1, (value)
A1, B1, C2, (value)
A1, B2, C1, (value)
A1, B2, C1, (value)
A1, B2, C2, (value)
A1, B2, C2, (value)
A2, B1, C1, (value)
A2, B1, C1, (value)
A2, B1, C2, (value)
A2, B1, C2, (value)
A2, B2, C1, (value)
A2, B2, C1, (value)
A2, B2, C2, (value)
A2, B2, C2, (value)
Run Code Online (Sandbox Code Playgroud)

我想在python中使用它作为字典,形式:

H = {
    'A1':{
        'B1':{
            'C1':[],'C2':[],'C3':[] },
        'B2':{
            'C1':[],'C2':[],'C3':[] },
        'B3':{
            'C1':[],'C2':[],'C3':[] }
    },
    'A2':{
        'B1':{
            'C1':[],'C2':[],'C3':[] },
        'B2':{
            'C1':[],'C2':[],'C3':[] },
        'B3':{
            'C1':[],'C2':[],'C3':[] }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样就H[A][B][C]产生了一个特定的唯一值列表.对于小字典,我可能只是如上所述预先定义结构,但我正在寻找一种有效的方法来迭代表并构建字典,而不提前指定字典键.

Ste*_*yne 10

input = [('A1', 'B1', 'C1', 'Value'), (...)]

from collections import defaultdict

tree = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
#Alternatively you could use partial() rather than lambda:
#tree = defaultdict(partial(defaultdict, partial(defaultdict, list)))

for x, y, z, value in input:
    tree[x][y][z].append(value)
Run Code Online (Sandbox Code Playgroud)

  • 在这里使用lambdas的另一种方法是使用``functools.partial()``:``tree = defaultdict(partial(defaultdict,partial(defaultdict,list)))`` - 我觉得这个更清楚,但可能只是我. (2认同)

ch3*_*3ka 5

如果您只访问 H[A][B][C] (也就是说,永远不会单独访问 H[A] 或 H[A][B]),我建议使用 IMO 更清洁的解决方案:使用元组作为 defaultdict 索引:

from collections import defaultdict
h = defaultdict(list)
for a, b, c, value in input:
    h[a, b, c].append(value)
Run Code Online (Sandbox Code Playgroud)