我的列表如下所示:
['', 'CCCTTTCGCGACTAGCTAATCTGGCATTGTCAATACAGCGACGTTTCCGTTACCCGGGTGCTGACTTCATACTT
CGAAGA', 'ACCGGGCCGCGGCTACTGGACCCATATCATGAACCGCAGGTG', '', '', 'AGATAAGCGTATCACG
ACCTCGTGATTAGCTTCGTGGCTACGGAAGACCGCAACAGGCCGCTCTTCTGATAAGTGTGCGG', '', '', 'ATTG
TCTTACCTCTGGTGGCATTGCAACAATGCAAATGAGAGTCACAAGATTTTTCTCCGCCCGAGAATTTCAAAGCTGT', '
TGAAGAGAGGGTCGCTAATTCGCAATTTTTAACCAAAAGGCGTGAAGGAATGTTTGCAGCTACGTCCGAAGGGCCACATA
', 'TTTTTTTAGCACTATCCGTAAATGGAAGGTACGATCCAGTCGACTAT', '', '', 'CCATGGACGGTTGGGGG
CCACTAGCTCAATAACCAACCCACCCCGGCAATTTTAACGTATCGCGCGGATATGTTGGCCTC', 'GACAGAGACGAGT
TCCGGAACTTTCTGCCTTCACACGAGCGGTTGTCTGACGTCAACCACACAGTGTGTGTGCGTAAATT', 'GGCGGGTGT
CCAGGAGAACTTCCCTGAAAACGATCGATGACCTAATAGGTAA', '']
那些是从文件中读取的样品DNA序列。列表可以有不同的长度,一个序列可以有10个字母和10,000个字母。在源文件中,它们由空行分隔,因此列表中的空项。如何加入空白之间的所有项目?
答案 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
变量中,此解决方案只对输入进行一次传递。