2016-06-30 2 views
-1

한 줄씩 파일을 읽고 한 줄의 문자열이 사전에서 다른 줄과 같은 줄에 있는지 확인하고 싶습니다. 이 코드파일 읽기 및 검사 사전

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 [ 'ALA']와 같은 것으로 바꾸는 것은 정상적으로 작동합니다. 여기서 내가 뭘 잘못하고 있니?

+2

우리는'file.pdb'의 스 니펫을 제공합니다. 2-3 라인과 같은 somehting도 충분합니다. –

+3

분명히,'line [17:20] .strip()'에서 읽히는 것은 3.2입니다. 잔여. 파일의 본질을 보지 않고 말할 수는 없습니다. –

+0

''dic'에'3.2'라는 이름의 키가 없다는 것을 알려줍니다. 어쩌면 당신의 조각은 wrogn 결과를 준다 – linusg

답변

1

문제는 당신이 라인 중 하나 resi에 대한 3.2의 값을 받고 3.2, 당신은 예외를 받고있어 DIC에 유효한 키가 아니므로하고있다.

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) 

n 키워드를 사용하여 첫 번째 방법은 사전에있는 키의 존재를 알 수있는 가장 좋은 방법입니다. 그것은 O (1) (해시 사용)에서 실행되는 반면 두 번째 방법은 사전의 키를 얻은 후에 선형 검색을 수행합니다.

두 방법 모두에서 단락 회로가 사용되므로 첫 번째 조건이 실패하면 두 번째 조건이 평가되지 않습니다. 또는 try..except 블록을 사용하여 예외를 구할 수 있습니다.

참고로 here을 참조하십시오.

+0

놀라워! 나는 파일 헤더가 시작 부분에 다른 줄이 있다는 것을 몰랐다. 고마워요 =) – Julian

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) 
0

'resi'가 dic의 키가 아니기 때문에 'ALA'가 사전의 키이기 때문에 dic [resi]를 사용할 때 Keyerror가 표시됩니다. print (dic [ 'ALA'])와 같은 것을 시도하면 'ALA'키 아래에 모든 것을 인쇄합니다.