我的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
答案 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})