【问题标题】:How to join certain items in list如何加入列表中的某些项目
【发布时间】:2014-08-31 00:58:32
【问题描述】:

我的列表如下所示:

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

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

【问题讨论】:

  • 当然,使用支持阅读 FASTA 格式的库会更容易。喜欢Biopython
  • 我猜的,但是我不能用一个,我得自己写函数。
  • @MartijnPieters 你是我的救星!非常感谢:)

标签: python list join fasta dna-sequence


【解决方案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 变量中,并且此解决方案仅对输入进行一次传递。

【讨论】:

  • 它的工作原理就像一个魅力,但你能向我解释一下它是如何工作的吗?或者写一个与上面代码等效的循环?我对 Python 和编程都是新手(我指的是两周前开始学习的新手 ;))而且我不太了解您的代码:/ 所以我很想学习新的东西,而不仅仅是使用您的解决方案: )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多