如何连接列表中的特定项

2 投票
1 回答
1291 浏览
提问于 2025-04-19 01:03

我的列表看起来是这样的:

['', '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变量中,这个解决方案只需遍历输入一次。

撰写回答