如何连接列表中的特定项
我的列表看起来是这样的:
['', 'CCCTTTCGCGACTAGCTAATCTGGCATTGTCAATACAGCGACGTTTCCGTTACCCGGGTGCTGACTTCATACTT
CGAAGA', 'ACCGGGCCGCGGCTACTGGACCCATATCATGAACCGCAGGTG', '', '', 'AGATAAGCGTATCACG
ACCTCGTGATTAGCTTCGTGGCTACGGAAGACCGCAACAGGCCGCTCTTCTGATAAGTGTGCGG', '', '', 'ATTG
TCTTACCTCTGGTGGCATTGCAACAATGCAAATGAGAGTCACAAGATTTTTCTCCGCCCGAGAATTTCAAAGCTGT', '
TGAAGAGAGGGTCGCTAATTCGCAATTTTTAACCAAAAGGCGTGAAGGAATGTTTGCAGCTACGTCCGAAGGGCCACATA
', 'TTTTTTTAGCACTATCCGTAAATGGAAGGTACGATCCAGTCGACTAT', '', '', 'CCATGGACGGTTGGGGG
CCACTAGCTCAATAACCAACCCACCCCGGCAATTTTAACGTATCGCGCGGATATGTTGGCCTC', 'GACAGAGACGAGT
TCCGGAACTTTCTGCCTTCACACGAGCGGTTGTCTGACGTCAACCACACAGTGTGTGTGCGTAAATT', 'GGCGGGTGT
CCAGGAGAACTTCCCTGAAAACGATCGATGACCTAATAGGTAA', '']
这些是从文件中读取的示例DNA序列。这个列表的长度可以不一样,每个序列的字母数也可以从10个到10,000个不等。在源文件中,序列之间用空行分隔,所以列表中会有空的项。请问我该如何把所有空项之间的内容连接起来呢?
1 个回答
2
试试这个方法,它是一种快速但不太优雅的解决方案,适合小规模的输入列表,但如果输入列表很大,就不太高效了:
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
变量中,这个解决方案只需遍历输入一次。