获取固定大小的子列表

2024-09-30 01:31:08 发布

您现在位置:Python中文网/ 问答频道 /正文

标题不清楚,但下面是我想做的

我有一条基因组链:

corpus_2 = ['TCAATCAC', 'GGGGGGGGGGG', 'AAAA']

我想提取固定大小的所有子列表。假设我想要大小为4的子列表

我查找的结果示例:['TCAA', 'CAAT', 'AATC', 'ATCA', 'TCAC'], ['GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG'], ['AAAA']]

我们将索引0的子列表添加到索引3,然后添加一个新字符串等

这是我的密码:

ngram_size=4
corpus=['TCAA', 'CAAT', 'AATC', 'ATCA', 'TCAC'], ['GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG'], ['AAAA']]
decoliste=[] #list output
        listemp=[] # I add one list by one list, each of these list corresponds to a list in input list.
        for element in self.corpus:
#             print(element)
            decoliste.append(listemp)
            listemp=[]

            for i in range(len(element)):
                try:
                    if len(element[i:i+self.ngram_size])==self.ngram_size:

                        listemp.append((element[i:i+self.ngram_size]))
                except:
                    pass
        decoliste.append(listemp)

        del(decoliste[0])
        print(decoliste)

我想知道你们是否可以给我一些关于如何大幅改进这段代码的提示(这段代码很长,老师不会喜欢的)


Tags: inself列表sizecorpuselementlistappend
2条回答

对于每个字符串,您可以遍历0与其长度减去ngram_size加1之间的所有索引,并获得从该索引开始的子字符串。使用列表理解将所有这些放在一起实际上使其非常优雅:

result = [[e[i:i + ngram_size] for i in range(len(e) + 1 - ngram_size)] for e in corpus_2]

使用^{}的替代解决方案:

>>> from itertools import combinations
>>> corpus_2 = ['TCAATCAC', 'GGGGGGGGGGG', 'AAAA']
>>> size = 4
>>> [[s[i:j] for i, j in combinations(range(len(s) + 1), r=2) if j - i == size] for s in corpus_2]
[['TCAA', 'CAAT', 'AATC', 'ATCA', 'TCAC'], ['GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG'], ['AAAA']]

相关问题 更多 >

    热门问题