2014-01-02 12 views
-1

Rosalind를 통해 문제를 해결하려고했습니다. 내가 붙어서 일주일이 지났어. 나는 이것을 가능한 한 간단하게 설명하려고 노력할 것입니다.해당 목록의 특정 요소가있는 목록 사전의 모든 요소 찾기

입력 - Genome이라는 문자열과 k, Lt의 정수입니다. 게놈은 일종의 유전 암호 코드입니다.

k은 각 킬로미터의 크기 인 주어진 정수입니다. kmer는 일부 의미를 지닌 유전 암호의 하위 문자열입니다. t은 kmer가 나타나는 시간을 덩어리로 나타냅니다. L은 덩어리를 형성하는 텍스트의 길이입니다. 예를 들어, L = 400이라면 400 문자의 덩어리 내에서 t 번 발생하는 kmer를 찾고 있습니다.

출력 - 게놈에서 (L, t) - 클럼프를 형성하는 모든 별개의 k-mer.

이 코드는 게놈을 취하여 가능한 모든 킬로미터로 분해하고 해당 킬로ers를 사전에 삽입합니다. kmers는 열쇠입니다. 값은 [frequency_of_kmer, [kmer locations]]과 같이 설정됩니다. 이 값은 사전에 다음과 같이 저장됩니다. {'AAAAA' : [y, [z1,z2]]}, 여기서 y은 발생 횟수이고, z1z2은 부분 문자열이있는 문자열의 인덱스입니다.

기본적으로, 나는 사전을 반복하려고합니다. 텍스트 내에서 t 번 발생하는 키를 찾고 싶습니다. 즉, 사전 d과 같은 모든 키를 찾으려면 d[key]==t입니다.

코드를 출력 한 다음에 출력하십시오.

코드 : 내가 제대로 이해하고있는 경우

from pprint import pprint 
genome = "CGGACTCGACAGATGTGAAGAAATGTGAAGACTGAGTGAAGAGAAGAGGAAACACGACACGACATTGCGACATAATGTACGAATGTAATGTGCCTATGGC" 
k = 5 
L = 75 
t = 4 
len_genome = int(len(genome)) 
l = [] 

for i in range (len_genome - k + 1): 
    kmer = genome[i:i +k] 
    # list of every possible kmer 
    l.append(kmer) 

d = {} 
for i in range (len(l)): 
    try: 
     d[l[i]][0] += 1 
     d[l[i]][1].append(i) 
    except KeyError: 
     d[l[i]] = [1, [i]] 

pprint(d) 
+5

이 프로그래밍 질문하지 같은 질문을 시도 산출 생물학 질문처럼. 힌트 :'genome','kmer' 또는'clump'라는 단어를 사용하지 마십시오 –

+0

코드에 무슨 문제가 있습니까? 즉 출력이 특별히 잘못된 것은 무엇이며 출력은 무엇입니까? 또한 들여 쓰기를 확인하십시오. –

+0

들여 쓰기가 깨졌습니다. 이것은 공백 대신 탭을 사용하면 생깁니다. 여기에서 성전을 시작하고 싶지 않으므로 편집기 설정을 변경하거나 여기에 들여 쓰기를 수정하십시오. – BartoszKP

답변

0

, 당신은 dictonary d의 열쇠 인 kmers의 모든 목록이 필요합니다.

사전의 키를 모두 얻으려면, 당신은과 같이, 사전 클래스의 keys() 방법을 사용할 수 있습니다 :

kmer_list=d.keys() 

당신이 특정 횟수를 발생하는 모든 시퀀스를 찾으려면 시도 :

occurance_times=4 
kmer_list=filter(lambda x: d[x][0]==occurance_times, d.keys()) 
1

편집 : 내가 제대로 이해하면이 , 이것은 아주 쉽게 달성 할 수있다 :

from pprint import pprint 
x = 4 
pprint({key: value for key, value in d.iteritems() if value[0] == x}) 

출력 :

{'AATGT': [4, [21, 73, 81, 86]], 
'CGACA': [4, [6, 54, 59, 67]], 
'GAAGA': [4, [16, 26, 37, 42]]} 

(아래 원래 답)

나는 덩어리가 무엇인지 모르겠지만, 이것은 당신이 액세스하는 방법이다는 두 번째 말 'AATGT'의 정수 (73 번째 7 번째 항목) :

['AATGT'] 키 값 'AATGT'을 가져오고 첫 번째 [1]은 가장 바깥 쪽 목록의 두 번째 항목에 액세스하고 두 번째 [1]은 가장 안쪽 목록의 두 번째 값에 액세스합니다.

이것은 예상대로 73을 산출한다. 이 모든 값을 반복하려는 경우

, 당신은 루프의 두 배를 사용할 수 있습니다

# d.iteritems() should be d.items() in Python 3.x 
for key, sublist in d.iteritems(): 
    print('kmer: {}'.format(key)) 
    for value in sublist[1]: 
     print value 

kmer: ACACG 
51 
56 
kmer: TAATG 
72 
85 
kmer: AGAGG 
44 
kmer: GGACT 
1 
(...) 
0
from collections import defaultdict 
    code="AGCTTTT...TTTTTC" 
    (k,L,t,counter,results) = (9,500,3,1,[]) 
    d = defaultdict(list) 
    for z in range (0,len(code)): 
     d[code[z:z+k]].append(z) 
    for value in d.items(): 
     if len(value[1])>=3: 
     for y in range(0,len(value[1])-2): 
      if value[1][y+t-1]-value[1][y] <= L-k: 
      results.append(value[0]) 
    results.sort() 
    if len(results)==0: 
     print "No result" 
    if len(results)==1: 
     print results[0], 
     print 1 
    if len(results)>1: 
     print results[0], 
     for i in range (0,len(results)-1): 
     if results[i+1]!=results[i]: 
      counter += 1 
      print results[i+1], 
    print counter 
관련 문제