2017-03-08 1 views
0

다음 코드는 큰 데이터 세트에서 길이가 다른 구간의 빈도를 계산하기위한 프로그램입니다. 두 목록 "snp"및 "bin_list"는 테스트 데이터입니다. 그리고 다음 코드와 같이 코드를 프로그래밍해야합니다.python : 간격 내에서 빈도를 계산할 때 다른 결과가 나타나는 이유

"continue"및 코드에서 "snp.remove (site)"를 사용하면 결과가 달라진다는 문제점이 있습니다.

코드에 "계속"을 사용하여, 나는 다음과 같은 결과를 얻었다 : 코드에 "snp.remove (사이트)"을 사용할 때 나는 다른 결과를 얻었다 그러나

Potri.001G000300up1k 26 
Potri.001G000400down1k 26 
Potri.001G000300part2 5 

:

Potri.001G000300up1k 26 
Potri.001G000400down1k 25 
Potri.001G000300part2 5 

실제로 첫 번째 결과는 저속에서 올바르지 만 두 번째 결과는 고속에서 약간 잘못되었습니다.

제 질문은 코드에서 "snp.remove (site)"를 사용할 때 어떻게 버그를 수정할 수 있습니까?

그리고 파이썬 2.7.12를 사용합니다.

참고 : 모든 루프에서 "snp"목록을 반복해야합니다.

#!/usr/bin/env python 

def locateBin(Start, End, site): 
    return site >= Start and site <= End 

snp = ['17', '24', '31', '36', '38', '43', '45', '50', '52', '58', '86', '224', '306', '369', '663', '665', '668', '740', '811', '844', '891', '942', '1059', '1097', '1186', '1371', '1437', '1458', '1487', '1537', '1571', '1720', '1853', '2066', '2238', '2292', '2296', '2332', '2367', '2387', '2483', '2585', '2772', '2856', '2935', '2944', '2966', '2967', '2991', '2992', '3048', '3166', '3211', '3241', '3280', '3350', '3351', '3367', '3373', '3378', '3406', '3449', '3454', '3533', '3573', '3621', '3623', '3643', '3644', '3697', '3745', '3757', '3822', '3867', '3893', '3949', '4094', '4142', '4149', '4260', '4457', '4462', '4511', '4528', '4535', '4622', '4719', '4722', '4775', '4790', '4801', '4863', '4873', '4879', '4928', '5044', '5454', '5498', '5557', '5584', '5805', '6215', '6231', '6243', '6293', '6346', '6365', '6401', '6421', '6616', '6812', '6861', '6925', '7023', '7126', '7341', '7342', '7369', '7412', '7413', '7483', '7501', '7645', '7679', '7681', '7799', '7828', '7896', '7928', '7944', '7950', '7971', '8002', '8003', '8038', '8058', '8092', '8134', '8213', '8224', '8275', '8292', '8323', '8378', '8444', '8481', '8498', '8499', '8504', '8556', '8616', '8660', '8676', '8710', '8773', '8817', '9158', '9228', '9232', '9302', '9321', '9340', '9383', '9429', '9538', '9602', '9691', '9723', '9880', '9914', '10044', '10046', '10068', '10073', '10176', '10192', '10237', '10241', '10300', '10368', '10618', '10742', '10835', '10959', '11025', '11028', '11260', '11275', '11528', '11912', '11986', '12062', '12095', '12347', '12366', '12513', '12560', '12592', '12648'] 

bin_list = [['Potri.001G000300up1k', 'Chr01', '7391', '8391'], ['Potri.001G000400down1k', 'Chr01', '7391', '8391'], ['Potri.001G000300part2', 'Chr01', '8625', '8860']] 


index = 0 
count_list = [] 

while index < len(bin_list): 
    num = 0 
    el = bin_list[index] 
    for site in snp: 
     if int(site) < int(el[2]): 
      continue 
      #snp.remove(site) 
     elif locateBin(int(el[2]), int(el[3]), int(site)): 
      num += 1 
     else: 
      count_list.append([el[0], num]) 
      break 
    index += 1 

for line in count_list: 
    print("%s\t%s\n" % (line[0], line[1])), 

답변

2

일반적으로 반복되는 동안 목록을 수정하면 안됩니다. 쉬운 수정은 iteration (for site in snp[:]:)의 복사본을 만드는 것입니다.

snp[:]은 목록의 사본을 만듭니다.

관련 문제