3

所以我想知道是否有人可以帮助我解决我遇到的这个问题。

假设我有一本字典:

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 被包含在理解中。

4

6 回答 6

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}
于 2012-05-11T21:21:44.050 回答
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}
于 2012-05-11T21:08:00.677 回答
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.chainiteritems()代替:

# 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。有关详细信息,请参阅此问题

于 2012-05-11T21:15:11.767 回答
1

以下列表推导将返回每个作为 dict 的值:

>>> d = {1: {2: 3}, 4: 5}
>>> [d[i] for i in d.keys() if isinstance(d[i],dict)]
[{2: 3}]
于 2012-05-11T21:09:29.703 回答
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}
于 2012-05-11T21:11:20.030 回答
0

使用 lambda 的其他方式

(lambda x: {k:v for x in d.values() if type(x) == dict for k,v in x.items()})(d)

于 2013-01-29T08:29:03.690 回答