如何加入列表中的某些项目

时间:2014-08-31 00:58:32

标签: python list join fasta dna-sequence

我的列表如下所示:

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

那些是从文件中读取的样品DNA序列。列表可以有不同的长度,一个序列可以有10个字母和10,000个字母。在源文件中,它们由空行分隔,因此列表中的空项。如何加入空白之间的所有项目?

1 个答案:

答案 0 :(得分:1)

试试这个,它是一个快速而肮脏的解决方案,运行正常,但如果输入列表非常大,则不会有效:

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

这是它的工作原理,使用来自内到外的生成器表达式和列表推导:

  • ',' 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变量中,此解决方案只对输入进行一次传递。