所以我想知道是否有人可以帮我解决这个问题。
假设我有一本字典:
d = {1: {2: 3}, 4: 5}
我想创建任何包含字典的字典:
wanted_result = {2: 3}
我正在尝试的是:
e = {inner_key: d[key][inner_key] for key in d.keys() for inner_key in d[key].keys() if isinstance(d[key], dict)}
然而,这导致我得到一个错误,说我没有密钥,我知道,但我认为我的条件会排除我的例子中的说法4被包含在理解中。
答案 0 :(得分:10)
d = {1: {2: 3}, 4: 5, 6: {7: 8}}
s = {k: v for elem in d.values() if type(elem) is dict for k, v in elem.items()}
>> {2: 3, 7: 8}
答案 1 :(得分:2)
在这种情况下,我建议您使用for循环和update
方法:
d = {1: {2: 3}, 4: 5, 6: {7: 8}}
inner_dicts = {}
for val in d.values():
if type(val) is dict:
inner_dicts.update(val)
print inner_dicts
# {2: 3, 7: 8}
答案 2 :(得分:1)
以下列表推导将返回每个dict的值:
>>> d = {1: {2: 3}, 4: 5}
>>> [d[i] for i in d.keys() if isinstance(d[i],dict)]
[{2: 3}]
答案 3 :(得分:1)
d = {1: {2: 3}, 4: 5,'j':{7:8}}
e={y:d[x][y] for x in d if isinstance(d[x],dict) for y in d[x]}
print(e)
{2: 3, 7: 8}
答案 4 :(得分:1)
我的第一个想法是这样的:
d = {1: {2: 3}, 4: 5, 6: {7: 8}}
generator = (x.items() for x in d.itervalues() if type(x) == dict)
s = dict(sum( generator, list() ))
# s = {2: 3, 7: 8}
但是,为了避免让sum()
构建所有items()
的大型临时列表,您可以使用itertools.chain和iteritems()
代替:
# chain "concatenates" iterables
from itertools import chain
d = {1: {2: 3}, 4: 5, 6: {7: 8}}
s = dict(chain( *(x.iteritems() for x in d.itervalues() if type(x) == dict) ))
# s = {2: 3, 7: 8}
您应该了解边缘情况。特别是如果相同的键在部分词典中,这些必然会以某种方式崩溃。
如果您还想支持从dict
收集d.values()
的子类,您可能确实想要使用isinstance
而不是type
。有关详细信息,请参阅this question。
答案 5 :(得分:0)
使用lambda的其他方式
(lambda x: {k:v for x in d.values() if type(x) == dict for k,v in x.items()})(d)