将列表转换为嵌套列表和dict

2024-09-30 19:35:41 发布

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

我有一组类似的数据:

[  {"name":"item.key" , "value":"value"},
   {"name":"item.key2" , "value":"value2"},
   {"name":"item.list.0" , "value":"listValue1"},
   {"name":"item.list.1" , "value":"listValue2"},
   {"name":"item.list.2" , "value":"listValue3"},·
   {"name":"item.list2.0.key1" , "value":"list2Key1Value"},
   {"name":"item.list2.0.key2" , "value":"list2Key2Value"},
   {"name":"item.list2.0.key3" , "value":"list2Key3Value"},·
   {"name":"item.list3.0.key1" , "value":"list3Key1Value"},
   {"name":"item.list3.0.key2" , "value":"list3Key2Value"},
   {"name":"item.list3.0.key3" , "value":"list3Key3Value"},
   {"name":"other.key" , "value":"otherKeyValue"}
]

名称是从包含列表和dict的嵌套数据中扁平化的。我现在想把它放回dicts和list(如果合适的话)。在

到目前为止,我有这个:

^{pr2}$

这将产生:

{'item': {
     'key': 'value',
     'key2': 'value2',
     'list': {
         '0': 'listValue1',
         '1': 'listValue2',
         '2': 'listValue3'},
     'list2': {
         '0': {
             'key1': 'list2Key1Value',
             'key2': 'list2Key2Value',
             'key3': 'list2Key3Value'}
     },
     'list3': {
         '0': {
             'key1': 'list3Key1Value',
             'key2': 'list3Key2Value',
             'key3': 'list3Key3Value'}
     }
 },
 'other': {'key': 'otherKeyValue'}
}

但是现在,我希望所有具有可以转换为int的键的dict都转换为list,这样我的最终输出看起来更像:

{'item': {
     'key': 'value',
     'key2': 'value2',
     'list': [
         'listValue1',
         'listValue2',
         'listValue3'],
     'list2': [{'key1': 'list2Key1Value',
             'key2': 'list2Key2Value',
             'key3': 'list2Key3Value'}],
     'list3': [{'key1': 'list3Key1Value',
             'key2': 'list3Key2Value',
             'key3': 'list3Key3Value'}]
 },
 'other': {'key': 'otherKeyValue'}
}

有什么建议可以帮我完成这个任务吗?在


Tags: keynamevalueitemlistkey2key1key3
3条回答

您可以递归地遍历所有字典,并使用以下命令检查是否可以将所有键转换为整数:

map(int, your_dict.keys())

如果其中一个键无法转换为int,则将生成ValueError。在

注意,这不会检查键是否是连续的整数,也不会检查它们是否从0开始,因此在将字典转换为列表时可能会浪费大量空间。在

这可能不是最有效的方法,但是。。。在

import pprint

data = [{"name":"item.key" , "value":"value"},
   {"name":"item.key2" , "value":"value2"},
   {"name":"item.list.0" , "value":"listValue1"},
   {"name":"item.list.1" , "value":"listValue2"},
   {"name":"item.list.2" , "value":"listValue3"},
   {"name":"item.list2.0.key1" , "value":"list2Key1Value"},
   {"name":"item.list2.0.key2" , "value":"list2Key2Value"},
   {"name":"item.list2.0.key3" , "value":"list2Key3Value"},
   {"name":"item.list3.0.key1" , "value":"list3Key1Value"},
   {"name":"item.list3.0.key2" , "value":"list3Key2Value"},
   {"name":"item.list3.0.key3" , "value":"list3Key3Value"},
   {"name":"other.key" , "value":"otherKeyValue"}]

obj = {}
def addObj(o, path, value):
    if len(path) > 1:
        o = o.setdefault(path.pop(0), {})
        addObj(o, path, value)
    else:
        o[path.pop(0)] = value

for item in data:
    parts = item['name'].split(".")
    addObj(obj, parts, item['value'])

# this function assumes all keys are strings
def convert(obj):
    if isinstance(obj, dict):
        if all(key.isdigit() for key in obj.keys()):
            return [convert(obj[key])
                    for key in sorted(obj.keys(), key=int)]
        return dict((key, convert(value)) for key, value in obj.items())
    return obj

pprint.pprint(convert(obj))

生成以下输出:

^{pr2}$

您可以更改genexp以更好地满足您的需要(它可能不是您的真实数据),但这将起作用:

for v in d.values():
    for key in (i for i in v if i.startswith('list')):
        v[key] = list(v[key].values())

现在,d字典包含了您想要的内容

相关问题 更多 >