2014-08-31 1 views
0

내 목록은 다음과 같습니다 목록에서 특정 항목을 가입 :어떻게

['', 'CCCTTTCGCGACTAGCTAATCTGGCATTGTCAATACAGCGACGTTTCCGTTACCCGGGTGCTGACTTCATACTT 
CGAAGA', 'ACCGGGCCGCGGCTACTGGACCCATATCATGAACCGCAGGTG', '', '', 'AGATAAGCGTATCACG 
ACCTCGTGATTAGCTTCGTGGCTACGGAAGACCGCAACAGGCCGCTCTTCTGATAAGTGTGCGG', '', '', 'ATTG 
TCTTACCTCTGGTGGCATTGCAACAATGCAAATGAGAGTCACAAGATTTTTCTCCGCCCGAGAATTTCAAAGCTGT', ' 
TGAAGAGAGGGTCGCTAATTCGCAATTTTTAACCAAAAGGCGTGAAGGAATGTTTGCAGCTACGTCCGAAGGGCCACATA 
', 'TTTTTTTAGCACTATCCGTAAATGGAAGGTACGATCCAGTCGACTAT', '', '', 'CCATGGACGGTTGGGGG 
CCACTAGCTCAATAACCAACCCACCCCGGCAATTTTAACGTATCGCGCGGATATGTTGGCCTC', 'GACAGAGACGAGT 
TCCGGAACTTTCTGCCTTCACACGAGCGGTTGTCTGACGTCAACCACACAGTGTGTGTGCGTAAATT', 'GGCGGGTGT 
CCAGGAGAACTTCCCTGAAAACGATCGATGACCTAATAGGTAA', ''] 

사람들은 파일에서 읽을 샘플 DNA 서열이다. 목록은 다양한 길이를 가질 수 있으며, 하나의 시퀀스는 10 개의 문자와 10,000 개의 문자를 가질 수 있습니다. 소스 파일에서 빈 줄로 구분되므로 목록에 빈 항목이 있습니다. 빈 항목 사이에있는 모든 항목을 어떻게 가입시킬 수 있습니까? 이 발전기 표현과 지능형리스트를 사용하여 작동 방식

lst = ['GATTACA', 'etc'] 
[x for x in ''.join(',' if not e else e for e in lst).split(',') if x] 

이는 다음과 같습니다 입력리스트가 정말 큰 경우

+1

물론 FASTA 형식 읽기를 지원하는 라이브러리를 사용하면 더 쉬울 것입니다. [Biopython] (http://biopython.org/wiki/Main_Page)처럼. –

+0

나는 추측하지만 하나는 사용할 수 없다. 나는 내 자신의 기능을 써야한다. –

+0

[이전에 썼습니다] (http://stackoverflow.com/a/12611576/100297). –

답변

0

잘 작동 신속하고 더러운 해결책이 시도하지만, 효율적으로하지 않습니다

  • ',' if not e else e for e in lst : 내부 아웃에서 ','
  • ''.join(',' if not e else e for e in lst)으로 목록에있는 모든 '' 문자열을 바꿉니다 함께 모든 문자열 가입 . 이제 시퀀스 사이의 공간이 하나 이상의 ,
  • ''.join(',' if not e else e for e in lst).split(',')로 구분됩니다 , 문자가있는 지점에서 문자열을 분할,이 목록을 생성
  • [x for x in ''.join(',' if not e else e for e in lst).split(',') if x] : 마지막으로, 목록을 떠나 빈 문자열을 제거 시퀀스

는 다른 방법으로, 동일한 기능은 다음과 같이 명시 적 루프를 사용하여 더 긴 방식으로 작성 될 수있다 :

answer = [] # final answer 
partial = [] # partial answer 
for e in lst: 
    if e == '':   # if current element is an empty string … 
     if partial:  # … and there's a partial answer 
      answer.append(''.join(partial)) # join and append partial answer 
      partial = [] # reset partial answer 
    else:     # otherwise it's a new element of partial answer 
     partial.append(e) # add it to partial answer 
else:      # this part executes after the loop exits 
    if partial:   # if one partial answer is left 
     answer.append(''.join(partial)) # add it to final answer 

생각은 동일 : 비어 있지 않은 문자열을 추적하여 누적하고, 빈 문자열이 발견되면 누적 값을 모두 추가하여 루프가 끝난 후 마지막 하위 목록을 추가합니다. 결과는 answer 변수로 끝나며이 솔루션은 입력을 한 번만 통과합니다.

+0

그것은 매력처럼 작동하지만, 제발 나에게 어떻게 단계별로 작동 설명해 주시겠습니까? 또는 위의 코드와 동일한 루프를 작성하십시오. 저는 파이썬과 프로그래밍에 익숙하지 않습니다. (그리고 2 주 전에 학습을 시작한 것이 새로울 것입니다.)) 나는 코드를 잘 이해하지 못합니다 :/그래서 저는 여러분의 솔루션을 사용하는 것이 아닌 새로운 것을 배우기를 원합니다.) –

+0

@TomekSztuk 오케이, 알았어;) 내 업데이트 된 답변보기 –

+1

와우! 매우 자세한 답변을 주셔서 감사합니다 :) –