【问题标题】:Unnest list of dictionaries to key value and subdicts将字典列表取消嵌套到键值和子目录
【发布时间】:2022-01-07 14:05:14
【问题描述】:

我有一个带有嵌套字典列表的字典,如下所示:

{'data1': [{'data2': 'value2'},
  {'data3': [{'data4': 'value4'},
    {'data5': [{'data6': 'value6'}, {'data7': 'value7'}]}]}]}

我要获取:

{'data1': {'data2': 'value2',
  'data3': {'data4': 'value4',
   'data5': {'data6': 'value6', 'data7': 'value7'}}}}

所以有 2 个任务,将单个子字典转换为 key:value{'data2':'value2'}'data2':'value2')并将字典列表转换为嵌套字典({'data5': [{'data6':'value6'},{'data7' : 'value7'}]}'data5': {'data6':'value6','data7' : 'value7'})。

这是一个深度嵌套的多层递归字典。

我正在尝试这样的事情:

def flat(j): 
    if not isinstance(j, (dict, list)): 
        return j 
    if isinstance(j, dict): 
        p=list(j.values()) 
        f=list(j.keys()) 
        tipo=type(p[0]).__name__ 
        if tipo=="str": 
             (Do something) 
    if isinstance(j, list): 
        return [flat(v) for v in j] 
    return {k: flat(v) for k, v in j.items()} 

为了扁平化单个字典,但我发现删除子字典并添加键:值的问题。当然还有另一篇关于如何将列表转换为嵌套字典的帖子

【问题讨论】:

  • 您尝试过的代码是否存在特殊问题?
  • 嵌套是否分支?如果是,你能举个例子吗?如果您有重复的键(例如 data6 == data7)会怎样?
  • @mkrieger 我正在尝试这样的事情: def flat(j): if not isinstance(j, (dict, list)): return j if isinstance(j, dict): p=list( j.values()) f=list(j.keys()) tipo=type(p[0]).__name__ if tipo=="str": (Do something) if isinstance(j, list): return [flat (v) for v in j] return {k: flat(v) for k, v in j.items()} 为了展平单个字典,但我发现删除子字典并添加 key:value 的问题.当然还有另一篇关于如何将列表转换为嵌套字典的帖子
  • 不要将大代码作为评论发布,编辑问题;)
  • @nozway 实际上有重复的键,但在不同的子字典下,所以应该没有问题。

标签: python list dictionary nested


【解决方案1】:

您可以使用递归方法并根据这是dictlist 还是其他东西来处理每个值:

def unnest(x):
    if isinstance(x, dict):
        return {k: unnest(v) for k,v in x.items()}
    elif isinstance(x, list):
        return {k:unnest(v) for e in x for k,v in unnest(e).items()}
    else:
        return x

# assuming the input dictionary as "d"
unnest(d)

输出:

{'data1': {'data2': 'value2',
           'data3': {'data4': 'value4',
                     'data5': {'data6': 'value6', 'data7': 'value7'}
                     },
           },
}

注意。这里的要求是列表只包含字典,如果不是你需要添加一个条件

【讨论】:

  • 非常感谢。它有效,抱歉,我的投票声望不到 15。
【解决方案2】:

您可以使用递归生成器函数:

data = {'data1': [{'data2': 'value2'}, {'data3': [{'data4': 'value4'}, {'data5': [{'data6': 'value6'}, {'data7': 'value7'}]}]}]}
def unnest(d):
  if isinstance(d, list):
    yield from [j for k in d for j in unnest(k)]
  else:
    for a, b in d.items():
       yield (a, b if not isinstance(b, (list, dict)) else dict(unnest(b)))

result = dict(unnest(data))

输出:

{'data1': {'data2': 'value2', 'data3': {'data4': 'value4', 'data5': {'data6': 'value6', 'data7': 'value7'}}}}

这适用于列表和字典。

【讨论】:

  • 非常感谢。我将搜索 yield 命令。但是没有返回命令就没有结果。无论如何,谢谢,对不起,我的投票声望不到 15。
猜你喜欢
  • 2021-05-10
  • 2020-03-23
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2021-03-29
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多