2012-03-21 62 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