如何添加到正确的deeplynested列表中?

2024-10-01 19:20:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试拆分一个字符串列表,并从这些字符串中创建一个深度嵌套的dict(最里面的值是一个列表)。然后我需要在列表中添加一个值。因为我的一些字符串是重复的,所以我需要确定正确的深度嵌套列表,以便附加到该列表。例如:

d = {'mykey': 'myval'}
my_strings = ['key1_key2_key3', 'key54_key6_key85_key86', 
              'key1_key2_key3', 'key1_key2',
              'key54_key6_key85_key86', 'key103_key508_key2',
              ]
master_d = {}

for my_s in my_strings:
    key = my_s.split('_')
    my_d = {'my_list': [d]}
    for s in reversed(key):
        my_d = {s: my_d}  # e.g. {'key1': {'key2': {'key3': {'my_list': [{'mykey': 'myval'}]}}}}
    for k, v in my_d.iteritems():
        if k in master_d and v.keys() == master_d[k].keys():
            tmp = master_d[k].values()[0]
            while not isinstance(tmp,list):
                tmp = tmp.values()[0]
            tmp.append(d)  # ends up appending to the wrong nested list
        else:
            master_d[k] = v

for k, v in master_d.iteritems():
    print k, v        

"""
Expecting: 
key1 {'key2': {'my_list': [{'mykey': 'myval'}]}}  # one d
key1 {'key2': {'key3': {'my_list': [{'mykey': 'myval'}, {'mykey': 'myval'}]}}}  # two d's
key54 {'key6': {'key85': {'key86': {'my_list': [{'mykey': 'myval'}, {'mykey': 'myval'}]}}}}  # two d's
key103 {'key508': {'key2': {'my_list': [{'mykey': 'myval'}]}}} # one d
"""

"""
Got:
key1 {'key2': {'key3': {'my_list': [{'mykey': 'myval'}, {'mykey': 'myval'}, {'mykey': 'myval'}]}}}
key103 {'key508': {'key2': {'my_list': [{'mykey': 'myval'}]}}}
key54 {'key6': {'key85': {'key86': {'my_list': [{'mykey': 'myval'}, {'mykey': 'myval'}]}}}}
"""

Tags: inmaster列表mytmplistkey2key1
1条回答
网友
1楼 · 发布于 2024-10-01 19:20:26

我想这正是你想要的。对于每一条路径,向前潜入主路径,并在需要的地方动态创建内容(使用setdefault):

d = {'mykey': 'myval'}
my_strings = ['key1_key2_key3', 'key54_key6_key85_key86', 
              'key1_key2_key3', 'key1_key2',
              'key54_key6_key85_key86', 'key103_key508_key2',
              ]
master_d = {}

for path in my_strings:
    tmp = master_d
    for key in path.split('_'):
        tmp = tmp.setdefault(key, {})
    tmp.setdefault('my_list', []).append(d)

from pprint import pprint
pprint(master_d)

由非常有用的pprint生成的输出:

{'key1': {'key2': {'key3': {'my_list': [{'mykey': 'myval'},
                                        {'mykey': 'myval'}]},
                   'my_list': [{'mykey': 'myval'}]}},
 'key103': {'key508': {'key2': {'my_list': [{'mykey': 'myval'}]}}},
 'key54': {'key6': {'key85': {'key86': {'my_list': [{'mykey': 'myval'},
                                                    {'mykey': 'myval'}]}}}}}

相关问题 更多 >

    热门问题