我想逐行读取一个文件并检查每一行是否我的字典允许该行的一个字符串与同一行中的另一个字符串。我已经想出了这个代码
dic={'ALA':['N','H','CA','HA','CB','HB1','HB2','HB3','C','O'],
'GLY':['N','H','CA','HA2','HA3','C','O'],
(...)
}
fin=open('file.pdb','r')
for line in fin:
atom=line[12:16].strip()
resi=line[17:20].strip()
if atom not in dic[resi]:
print(line)
但它给了我:
Traceback (most recent call last):
File "names.py", line 38, in <module>
if atom not in dic[resi]:
KeyError: '3.2'
所以这不起作用。奇怪地将dic [resi]替换为dic [&#39; ALA&#39;]之类的工作正常。我在这里做错了什么?
答案 0 :(得分:1)
问题是你为其中一行获得了3.2
的{{1}}值,而且由于resi
不是dic中的有效密钥,因此您获得了一个例外
3.2
编辑:
for line in fin:
atom=line[12:16].strip()
resi=line[17:20].strip()
if resi in dic and atom not in dic[resi]:
print(line)
使用for line in fin:
atom=line[12:16].strip()
resi=line[17:20].strip()
if resi in dic.keys() and atom not in dic[resi]:
print(line)
关键字的第一种方法是了解字典中是否存在密钥的最佳方法。它在O(1)(使用散列)中运行,而第二种方法在获取字典的键后进行线性搜索。
在这两种方法中,由于使用了短路,如果第一个条件失败,则永远不会评估第二个条件。或者,您可以使用n
阻止来拯救异常。
供参考,请参阅here。
答案 1 :(得分:0)
dic
中没有名为“3.2”的键。我想你应该先检查一下密钥名称。
for line in fin:
atom=line[12:16].strip()
resi=line[17:20].strip()
result = dic.get(resi)
if result and (atom not in result):
print(line)
答案 2 :(得分:0)
当你使用dic [resi]时,它说Keyerror是因为&#39; resi&#39;不是一个关键词,但ALA&#39; ALA&#39;是你词典中的关键。如果您尝试打印(dic [&#39; ALA&#39;]),它会在“ALA&#39;”下打印所有内容。键。