2012-03-21 50 views
1

我有一個defaultdict(名單)和其他常用的字典默認值蟒蛇設置字典的缺失值

A = {1:["blah", "nire"], 2:["fooblah"], 3:["blahblah"]} 
B = {1: "something" ,2:"somethingsomething"} 

現在可以說,我有這樣的事情

missing_value = "fill_this" 

現在,第一我想找出B中缺少的關鍵字(如3缺失) ,然後將這些關鍵字設置爲值missing_value? 這是什麼pythonic方式? 感謝

回答

6

您可以使用setdefault

for k in A: 
    B.setdefault(k, "fill_this") 

這是基本相同的時間越長:

for k in A: 
    if k not in B: 
     B[k] = "fill_this" 

然而,由於setdefault只需要查找的每一k一次,setdefault比快這個「測試&套」解決方案。

可選地(也可能是更慢),確定該組差異,並設置(沒有雙關語意)的那些值:

for k in set(A).difference(B): 
    B[k] = "fill_this" 
+0

您好..如果一個是defaultdict(名單)(遺憾錯過了在原始描述.. mybad) – Fraz 2012-03-21 19:31:18

+0

然後,它的作品一樣好。 'defaultdict'實現自己的'setdefault'。 – phihag 2012-03-21 19:33:13

+0

我覺得應該是'如果k不在B'。 – ovgolovin 2012-03-21 19:42:00

1

該溶液是要經過A和更新B在必要。這將有O(len(A))複雜:

for key in A: 
    if key not in B: 
     B[key] = missing_value 
+0

嗨..如果A是一個defaultdict(列表)(對不起,錯過了這個原始描述.. mybad) – Fraz 2012-03-21 19:32:18

+1

@phihag你說得對'set'在內存中不必要的創建。我已經更新了答案以反映這一點。 'set(A)-set(b)'是'O(len(A))'的複雜性,因爲算法通過set(A)並查找set(A)的每個元素,如果它在set中(B)',每個元素都是'O(1)'。但最終你是對的:)因爲在減去集合之前,創建'set(B)',它是'O(len(B))'。我會更新答案。 – ovgolovin 2012-03-21 19:37:40

1

這裏有一種方法:

def test(): 
    A = {1:"blah", 2:"fooblah", 3:"blahblah"} 
    B = {1: "something" ,2:"somethingsomething"} 
    keys=set(A.keys()).difference(set(B.keys())) 
    for k in keys: 
     B[k]="missing" 
    print (B) 
+1

固定,謝謝.... – Sid 2012-03-21 19:42:08

-1

當我看到需要這個,有一個標準的一套鑰匙在類型的字典字典進行檢查。如果是這樣,如果性能不是一個重要因素,我認爲這是最乾淨的語法。

template = {k: default for k in domain} 
for k, d in dicts.items(): 
    dicts[k] = template.copy().update(d) 
+1

這實際上是錯誤的,當然,因爲update()不返回更新的字典。修復它使它不那麼簡潔,但仍然是一個有用的模式。 – 2016-04-05 18:19:21