2014-11-24 38 views
0

我有以下代码:如何处理在Python字典找不到钥匙

from math import sqrt 
from collections import Counter 

def forSearch(): 
    words = {'bit':{1:3,2:4,3:19,4:0},'shoe':{1:0,2:0,3:0,4:0},'dog':{1:3,2:0,3:4,4:5}, 'red':{1:0,2:0,3:15,4:0}} 
    search = {'bit':1,'dog':3,'shoe':5} 
num_files = 4 

    file_relevancy = Counter() 
    c = sqrt(sum([x**2 for x in search.values()])) 
    for i in range(1, num_files+1): 
     words_ith_val = [words[x][i] for x in search.keys() ] 
     a = sum([search[key] * words[key][i] for key in search.keys()]) 
     b = sqrt(sum([x**2 for x in words_ith_val])) 
     file_relevancy[i] = (a/(b * c)) 

    return [x[0] for x in file_relevancy.most_common(num_files)] 

print forSearch() 

然而,这其中包含在搜索,但无法用语言文字方面的问题:

我想在这里这样说:

for i in range(1, num_files+1): 
    if corresponding key in words cannot be found 
     insert it and make its value = 0 
    words_ith_val = [words[x][i] for x in search.keys() ] 

那么它应该工作?

除非其他人有更好的建议吗?

+0

您的'words'变量声明应该能够使用数组语法:'words = {'bit':[3,4,19,0]'shoe':[0,0,0,0], '狗':[3,0,4]}。你可能想坚持0-索引(从0开始计数,而不是1) – 2014-11-24 08:12:02

+0

我不允许改变单词的方式。 – DannyBoy 2014-11-24 08:36:56

回答

2

collections.defaultdict

import collections 

D = collections.defaultdict(int) 
D['foo'] = 42 
print D['foo'], D['bar'] 
+0

你能解释一下吗? – 2014-11-24 08:18:50

+0

@VincentBeltman:该示例的哪个部分令人困惑? – 2014-11-24 08:20:30

+0

没关系没看到链接。 – 2014-11-24 08:20:54

0

这个怎么样代码:

if key not in words: 
    words[key] = {k+1: 0 for k in range(num_files)} 

在你的代码,你可以尝试做

for key in search.keys(): 
    if key not in words: 
     words[key] = {k+1: 0 for k in range(num_files)} 
    words_ith_val = [words[key][k + 1] for k in range(num_files)] 
+0

这是一个简化的问题,实际上有数百个文件。 – DannyBoy 2014-11-24 08:33:11

+0

@DannyBoy,现在答案在num_files变量上进行参数化。 – 2014-11-24 09:02:04

+0

我得到一个错误:UnboundLocalError:在赋值之前引用的局部变量'key' – DannyBoy 2014-11-24 09:08:03

2

可以使用defaultdict:

from collections import defaultdict 
d = defaultdict(int) 

这将初始化密钥是在访问和默认值创建的字典为0,可以使用其他类型还有:

defaultdict(dict) 
defaultdict(list) 

他们将一个空的字典/列表进行初始化。 您也可以使用工厂方法覆盖默认值。详情请参阅https://docs.python.org/2/library/collections.html#collections.defaultdict

+0

这个问题被简化了,我必须使用字典中的单词,并且以这种格式。 – DannyBoy 2014-11-24 08:36:29

相关问题