2012-10-18 57 views
4

我有形式的字典:如何獲得在2D字典的所有鍵蟒蛇

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

所以,讓我們看看第二度鍵..

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

的唯一的那麼總數二階鍵:

1,2,3 

現在,我要修改這個字典爲

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

所以不存在在特定的二維字典基本上所有的二階鍵..增加值爲0。

什麼是Python的方式來做到這一點的關鍵? 感謝

回答

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

for k in d: 
    for kk in keyset: 
     d[k].setdefault(kk, 0) 
+1

+1。簡單易讀。一個很好的提醒,不要在一行上做太多。 –

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) 
+0

在我能理解之前,我不得不閱讀你使用'reduce'的幾次。 'second_order_keys = set(k for v in d.itervalues()for k in v)'對我來說更簡單。 –

+0

@StevenRumbalski :)我仍然無法得到'減少'在那裏,爲什麼需要'或'運營商。 – ovgolovin

+0

@StevenRumbalski只有一分鐘後才知道。確實非常複雜! – ovgolovin

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

在這裏使用設置差異來獲取丟失的鑰匙,然後update()的字典:

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]) 
+1

不需要將'zip'的結果轉換爲'dict'。 'update'可以處理兩個元組元組的列表。 –

+0

在我看來,如果使用'set(key2 key,value2 in value()for key2 in value)',則會更加Pythonic。另外,不需要在'd [x] .update(dict(zip(foo,[0] * len(foo))))'中構建'dict',因爲'update'只需要迭代器,所以'd如果使用了iteritems(),那麼[x] .update(zip(foo,[0] * len(foo)))''''''''''''''''''''''''這裏也可以用'value'代替。 – ovgolovin

+1

'd [x] .update((k,0)for k in foo)'可能是最簡單的。 –

2

我喜歡Ashwini Chaudhar的解決方案年。

,我剪輯納入與其他小的改動意見的所有建議,它看起來我怎麼會喜歡它:

編輯(包含史蒂芬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) 
+0

我會將第一行更改爲'all_second_keys = set(key for value in d.itervalues()for key in value)''。 –

+0

第二行爲:for for value in d.itervalues():value.update((key,0)for all_second_keys.difference(value))' –

+1

@StevenRumbalski謝謝!我更新了答案。我只是沒有改變......對於all_second_keys中的鍵,如果鍵不在value中,則對於all_second_keys.difference(value)中的鍵。他們的時間複雜度是相同的,但我更喜歡它,我更喜歡它的答案。 – ovgolovin