【问题标题】:How to flatten a nested dict and exclude duplicate keys如何展平嵌套字典并排除重复键
【发布时间】:2015-02-06 06:52:03
【问题描述】:

我有一本字典如下:

lst1 = {1: {"a": "x","b": "y"}, 2: {"b": "y", "c": "z"}}

我想用它制作一个扁平的字典。应删除任何重复的键,以便在扁平化的字典中仅存在嵌套字典之一的唯一键。上面的dict应该变成:

{"a": "x", "c": "z"}

简单的代码是:

for key, value in lst1.iteritems():
   for key1, value1  in value.iteritems():
      if key1 <> "b":
         lst2[key1]=value1 

我尝试了一些以前的答案hereherehere,但无法正常工作。

以下代码返回错误:值未定义

lst2 = {key1: value1 for key1, value1 in value for key, value in lst1.items()}

这个:

 lst2 = dict((key1, value1) for key1, value1 in (value for key, value in lst1.items()))

返回:

 {'a': 'b', 'c': 'b'}

如前所述,如何正确展平结构?

【问题讨论】:

    标签: python dictionary dictionary-comprehension


    【解决方案1】:

    单一的理解可能无法实现,因为您需要跟踪哪些键已添加到扁平结构中,以便在重复时删除它们。在 for 循环中构建扁平结构的解决方案仍然很简单。将子字典中的项目添加到输出中,如果再次找到该键,则删除。

    data = {1: {'a': 'x', 'b': 'y'}, 2: {'b': 'y', 'c': 'z'}}
    out = {}
    
    for sub in data.values():
         for key, value in sub.items():
             if key in out:
                 del out[key]
             else:
                 out[key] = value
    
    print(out)  # {'a': 'x', 'c': 'z'}
    

    您也可以使用两个推导式和一个Counter 来做到这一点。首先跟踪每个子键出现的次数,然后仅将出现一次的键压平。

    from collections import Counter
    
    data = {1: {'a': 'x', 'b': 'y'}, 2: {'b': 'y', 'c': 'z'}}
    
    c = Counter(key for sub in data.values() for key in sub)
    out = {key: value for sub in data.values() for key, value in sub.items() if c[key] == 1}
    
    print(out)  # {'a': 'x', 'c': 'z'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 2021-06-02
      • 2019-11-14
      • 1970-01-01
      • 2021-03-14
      • 2018-05-16
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多