如何展平嵌套的dict并排除重复的键

时间:2014-12-08 15:14:17

标签: python dictionary dictionary-comprehension

我有一本字典词典如下:

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

我想用它制作一个扁平的字典。应删除任何重复的键,以便在展平的dict中只存在一个嵌套dicts独有的键。上面的词典应该成为:

{"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'}

如何正确描述结构?

1 个答案:

答案 0 :(得分: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'}