Python中的字典函数出现错误

时间:2011-10-05 22:34:58

标签: python dictionary

我的python脚本的一部分: (我首先制作了字典“h”)

def histogram(L):
    d= {}
    for x in L:
       if x in d:
          d[x] +=1
       else:
          d[x] =1
    return d
h=histogram(LIST)

for vhfile in vhfiles:
    linelist=commands.getoutput('cat ' + vhfile).splitlines(True)
    list1=[]
    for line in linelist:
        name1 = line.split()[0]
        if int(h[name1]) <= 300:
           list1.append(line)

然后我在“if”行出错:

File "/home/xug/scratch/mrfast/NA12878/dis_rm.py", line 51, in <module>
    if int(h[name1]) <= 300:
KeyError: '080821_HWI-EAS301_0002_30ALBAAXX:1:46:1643:1310'

知道这里发生了什么吗? THX

2 个答案:

答案 0 :(得分:3)

当您尝试在KeyError中查找某些内容时,您会收到dict,并且dict不包含该密钥。

在这种情况下,似乎'080821_HWI-EAS301_0002_30ALBAAXX:1:46:1643:1310'中没有出现关键h

答案 1 :(得分:2)

键错误表示您在dict中引用了一个不存在的键。检索指定键时的值时出错,因为该键不存在。

解决这个问题的一种方法是使用try / except块。如果'try'中的代码引发'KeyError',你知道name1不在h中,你可以做任何合适的事情。

for line in linelist:
    name1 = line.split()[0]
    try:
        if int(h[name1]) <= 300:
           list1.append(line)
    except KeyError:
         <code here to deal with the condition>

这种支持异常处理而非过度使用'if'检查的方法在Python社区中称为“EAFP”(比请求更容易请求宽恕)。

你也可以(使用较少的Pythonic方法)在尝试引用之前检查name1是否在列表中:

if name1 in h:
    if int(h[name1]) <= 300:
       ... you get the idea

这种方法称为“在你跳跃之前看”(LBYL)。 EAFP通常是优选的。

顺便说一下,你根本不需要直方图功能。在Python 2.7中,有一个Counter对象可以为您执行此操作:

>>> LIST = "This is a sentence that will get split into multiple list elements. The list elements will get counted using defaultdict, so you don't need the histogram function at all.".split()    
>>> LIST
['This', 'is', 'a', 'sentence', 'that', 'will', 'get', 'split', 'into', 'multiple', 'list', 'elements.', 'The', 'list', 'elements', 'will', 'get', 'counted', 'using', 'defaultdict,', 'so', 'you', "don't", 'need', 'the', 'histogram', 'function', 'at', 'all.']    
>>> from collections import Counter    
>>> c = Counter(LIST)
>>> c
Counter({'get': 2, 'list': 2, 'will': 2, 'defaultdict,': 1, 'elements.': 1, "don't": 1, 'is': 1, 'at': 1, 'need': 1, 'sentence': 1, 'split': 1, 'you': 1, 'into': 1, 'function': 1, 'elements': 1, 'multiple': 1, 'that': 1, 'This': 1, 'histogram': 1, 'using': 1, 'The': 1, 'a': 1, 'all.': 1, 'so': 1, 'the': 1, 'counted': 1})

在2.7之前,您可以使用defaultdict获得相同的结果:

>>> from collections import defaultdict
>>> dd = defaultdict(int)
>>> for word in LIST:
...     dd[word] += 1
... 
>>> dd
defaultdict(<type 'int'>, {'defaultdict,': 1, 'elements.': 1, "don't": 1, 'is': 1, 'at': 1, 'need': 1, 'sentence': 1, 'split': 1, 'get': 2, 'you': 1, 'into': 1, 'function': 1, 'elements': 1, 'multiple': 1, 'that': 1, 'This': 1, 'histogram': 1, 'using': 1, 'The': 1, 'a': 1, 'all.': 1, 'list': 2, 'will': 2, 'so': 1, 'the': 1, 'counted': 1})