0

私は辞書の理解を書こうとしています。

私はこのような辞書を持っています:

main_dict = {
    'A' : {'key1' : 'valueA1', 'key2' : 'valueA2'},
    'B' : {'key2' : 'valueB2', 'key3' : 'valueB3'},
    'C' : {'key3' : 'valueC3', 'key1' : 'valueC1'}}

次のロジックを実行したい:

d = {}
for k_outer, v_outer in main_dict.items():
    for k_inner, v_inner in v_outer.items():
        if k_inner in d.keys():
            d[k_inner].append([k_outer, v_inner])
        else:
            d[k_inner] = [[k_outer, v_inner]]

次の結果が得られます。

{'key3': [['C', 'valueC3'], ['B', 'valueB3']], 
 'key2': [['A', 'valueA2'], ['B', 'valueB2']], 
 'key1': [['A', 'valueA1'], ['C', 'valueC1']]}

(使用できることはわかっていますdefaultdict(list)が、これは単なる例です)

dict-comprehension を使用してロジックを実行したいのですが、これまでのところ次のようになっています。

d = {k : [m, v] for m, x in main_dict.items() for k, v in x.items()}

これは機能しません。次の出力しか得られません。

{'key3' : ['B', 'valueB3'],
'key2' : ['B', 'valueB2'],
'key1' : ['C', 'valueC1']}

各 inner_key で見つかった最後のインスタンスはどれですか...

このネストされたリスト内包表記を正しく実行する方法がわかりません。複数のバリエーションを試しましたが、すべて前回よりも悪いものでした。

4

4 に答える 4

2

次のようなことを試すことができます:

In [61]: main_dict
Out[61]: 
{'A': {'key1': 'valueA1', 'key2': 'valueA2'},
 'B': {'key2': 'valueB2', 'key3': 'valueB3'},
 'C': {'key1': 'valueC1', 'key3': 'valueC3'}}

In [62]: keys=set(chain(*[x for x in main_dict.values()]))

In [64]: keys
Out[64]: set(['key3', 'key2', 'key1'])

In [63]: {x:[[y,main_dict[y][x]] for y in main_dict if x in main_dict[y]] for x in keys}
Out[63]: 
{'key1': [['A', 'valueA1'], ['C', 'valueC1']],
 'key2': [['A', 'valueA2'], ['B', 'valueB2']],
 'key3': [['C', 'valueC3'], ['B', 'valueB3']]}

を使用したより読みやすいソリューションdict.setdefault:

In [81]: d={}

In [82]: for x in keys:
    for y in main_dict:
       if x in main_dict[y]:
           d.setdefault(x,[]).append([y,main_dict[y][x]])
   ....:            

In [83]: d
Out[83]: 
{'key1': [['A', 'valueA1'], ['C', 'valueC1']],
 'key2': [['A', 'valueA2'], ['B', 'valueB2']],
 'key3': [['C', 'valueC3'], ['B', 'valueB3']]}
于 2013-01-06T11:43:38.097 に答える
1

このようなタスクを達成するために3つの辞書内包表記を使用して、3番目の辞書内包表記は最初の2つの辞書を組み合わせることです。

e = {k : [m, v] for m, x in main_dict.items() for k, v in x.items()}
f = {k : [m, v] for m, x in main_dict.items() for k, v in x.items() if [m,v] not in e.values()}
g = {k1 : [m, v] for k1,m in e.items() for k2,v in f.items() if k1==k2}
于 2013-01-06T12:08:44.847 に答える
0

最後に、これは私が使用したものです:

from collections import defaultdict

d = defaultdict(list)
for m, x in main_dict.items():
    for k, v in x.items():
        d[k].append((m, v))
于 2013-01-10T09:27:39.903 に答える
0

1 つのオプションは、itertools.groupbyを使用することです。

from itertools import groupby
from operator import itemgetter

main_dict = {
    'A' : {'key1' : 'valueA1', 'key2' : 'valueA2'},
    'B' : {'key2' : 'valueB2', 'key3' : 'valueB3'},
    'C' : {'key3' : 'valueC3', 'key1' : 'valueC1'}}

## Pull inner key, outer key and value and sort by key (prior to grouping)
x = sorted([(k2, [k1, v2]) for k1, v1 in main_dict.items() for k2, v2, in v1.items()])

## Group by key. This creates an itertools.groupby object that can be iterated
## to get key and value iterables
xx = groupby(x, key=itemgetter(0))

for k, g in xx:
    print('{0} : {1}'.format(k, [r[1] for r in list(g)]))

データとパフォーマンスの要件によっては、並べ替えが理想的ではない場合があるため、プロファイリングする価値があります。

さらに、指定された dict ではなく、groupby オブジェクトになります。それはあなたのニーズに十分な「辞書のような」ものかもしれません。それを繰り返すと、キーとイテラブルが生成されます。

于 2013-01-06T13:35:36.337 に答える