4

私は形式の辞書を持っています:

d = {123:{2:1,3:1}, 124:{3:1}, 125:{2:1},126:{1:1}}

それでは、2度のキーを調べてみましょう。

123--> 2,3
124--> 3
125--> 2
126--> 1

したがって、一意の2次キーの総数は次のとおりです。

1,2,3

今、私はこのdictを次のように変更したいと思います

 d = {123:{1:0,2:1,3:1}, 124:{1:0,2:0,3:1}, 125:{1:0,2:1,3:0},126:{1:1,2:0,3:0}}

したがって、基本的に、特定の2ddictに存在しないすべての2次キー..そのキーに値0を追加します。

これを行うためのpythonicの方法は何ですか?ありがとう

4

4 に答える 4

9
keyset = set()
for k in d:
    keyset.update(d[k])

for k in d:
    for kk in keyset:
        d[k].setdefault(kk, 0)
于 2012-10-18T17:12:21.880 に答える
3
In [25]: d = {123:{2:1,3:1}, 124:{3:1}, 125:{2:1},126:{1:1}}

In [26]: se=set(y for x in d for y in d[x])

In [27]: for x in d:
    foo=se.difference(d[x])
    d[x].update(dict(zip(foo,[0]*len(foo))))
   ....:     
   ....:     

In [30]: d
Out[30]: 
{123: {1: 0, 2: 1, 3: 1},
 124: {1: 0, 2: 0, 3: 1},
 125: {1: 0, 2: 1, 3: 0},
 126: {1: 1, 2: 0, 3: 0}}

ここでは、set Differenceを使用して、欠落しているキーを取得してからupdate()、dictを取得します。

In [39]: for x in d:
    foo=se.difference(d[x])
    print foo                # missing keys per dict
set([1])
set([1, 2])
set([1, 3])
set([2, 3])
于 2012-10-18T17:16:28.277 に答える
2

アシュウィニ・チャウダリーの解決策が好きです。

私はそれを編集して、コメント内のすべての提案を他の小さな変更とともに組み込み、私がそれをどのように好むかを確認しました。

編集済み(この回答にSteven Rumbalskiの提案を組み込んでいます)。

all_second_keys = set(key for value in d.itervalues() for key in value)

for value in d.itervalues():
    value.update((key,0) for key in all_second_keys if key not in value)
于 2012-10-18T17:38:53.507 に答える
1
import operator

second_order_keys = reduce(operator.__or__,
                           (set(v.iterkeys()) for v in d.itervalues()))
for v in d.itervalues():
    for k in second_order_keys:
        v.setdefault(k, 0)

または、Python 3の場合:

from functools import reduce
import operator

second_order_keys = reduce(operator.__or__,
                           (v.keys() for v in d.values()))
for v in d.values():
    for k in second_order_keys:
        v.setdefault(k, 0)
于 2012-10-18T17:14:24.653 に答える