0

我有一个字典字典如下:

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

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

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

简单的代码是:

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

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

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

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

正如我所描述的,我怎样才能正确地展平结构?

4

1 回答 1

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'}
于 2014-12-08T15:45:09.447 回答