2011-12-27 6 views
1

for 루프를 사용하여 목록을 작성하고 슬라이스 표기법을 사용하려고합니다. 내 원하는 출력은 구조의 목록이 될 것입니다 :for 루프에서 slice를 사용하여 목록을 작성하십시오.

known_result[i] = (record.query_id, (align.title, align.title,align.title....)) 

그러나 내가 일을 슬라이스 연산자를 얻는 데 문제가 있어요 : 결과

knowns = "output.xml" 
i=0 
for record in NCBIXML.parse(open(knowns)): 
    known_results[i] = record.query_id  
    known_results[i][1] = (align.title for align in record.alignment)  
    i+=1 

:

list assignment index out of range. 

내가 BioPython의 NCBIXML 모듈을 사용하여 일련의 시퀀스를 반복하지만 문제는 목록에 추가됩니다. 누구든지 슬라이스의 사용을 변경하거나 다른 방법을 통해 원하는 목록을 작성하는 방법에 대한 아이디어가 있습니까?

감사 CP 1

답변

2

존재하지 않는 인덱스에 list에 값을 할당 할 수 없습니다 ([바이오 스타 (Biostar)]에서 crossposted)

자크. 요소를 추가하는 방법 (일반적인 사용 사례 인 목록의 끝에 있음)은 목록의 .append 메서드를 사용하는 것입니다. 위의 코드는 테스트되지 않은, 그래서 버그를 포함 할 수 있습니다 : 귀하의 경우

, 라인
known_results[i] = record.query_id  
known_results[i][1] = (align.title for align in record.alignment) 

아마

element=(record.query_id, tuple(align.title for align in record.alignment)) 
known_results.append(element) 

경고로 변경해야합니다. 그러나 그 뒤에있는 아이디어가 효과가있다.

1

사용 :

for record in NCBIXML.parse(open(knowns)): 
    known_results[i] = (record.query_id, None)  
    known_results[i][1] = (align.title for align in record.alignment)  
    i+=1 
1

난 당신이 바로 당신이 모든 record.query_id 하나 이상의 일치 align.title을 할당 할 수있는 경우. 그래서 당신의 query_ids 고유하고 그 고유 ID는 일부 제목과 관련이있는 것 같아요. 그렇다면 목록 대신 사전을 제안합니다.

사전 적가 키 (예를 들어 record.quer_id)와 값 (들) (align.title의 예를 들어 목록)

catalog = {} 

for record in NCBIXML.parse(open(knowns)): 
    catalog[record.query_id] = [align.title for align in record.alignment] 

당신을 통해 반복 할 수있는 하나이 카탈로그에 액세스하려면 구성

for query_id in catalog: 
    print catalog[query_id] # returns the title-list for the actual key 

또는 원하는 것을 알고 있으면 직접 액세스 할 수 있습니다.

query_id = XYZ_Whatever 
print catalog[query_id] 
+0

멋진 방법입니다. 유용하다고 생각합니다. 다음 단계는 두 목록/사전의 내용을 반복적으로 비교/점수를 매기므로 목록인지 사전인지 여부가 중요하지 않습니다. 사전을 사용하면 성능이 향상됩니까? – zach

+0

다릅니다. 모든 키에 대해 루프를 수행하고 있다면 아마도 그렇지 않을 것입니다. 일부 키를 필터링 할 수 있다면 아마도 그렇습니다. 그것은 당신이 성취하고자하는 것에 달려 있습니다. –