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

ただし、これにより、intにキーがないというエラーが発生します。これは私が知っていることですが、条件付きでは、例からたとえば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

次のリスト内包表記は、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 に答える
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()すべての大きな一時リストを作成しないようにするために、 itertools.chainitems()使用して代わりに次のことを行うことができます。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()を使用することをお勧めします。詳細については、この質問を参照してください。isinstancetype

于 2012-05-11T21:15:11.767 に答える
0

ラムダを使用する他の方法

(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 に答える