我有一本字典词典如下:
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
我尝试了之前的一些答案here,here和here,但无法使其正常工作。
以下代码返回错误:未定义值
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'}
如何正确描述结构?
答案 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'}