获取固定大小的子列表
Get sublists of fixed size
标题不清楚,但这是我想做的。
我有一个基因组链:
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)
我想知道你是否可以给我一些关于如何大幅改进这段代码的提示(它真的很长,老师不会喜欢它)。
对于每个字符串,您可以遍历 0 和它的长度减去 ngram_size
加一之间的所有索引,并获得从该索引开始的子字符串。使用列表理解将所有这些放在一起实际上使它非常优雅:
result = [[e[i:i + ngram_size] for i in range(len(e) + 1 - ngram_size)] for e in corpus_2]
使用 itertools.<b>combinations</b>
的替代解决方案:
>>> 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']]
标题不清楚,但这是我想做的。
我有一个基因组链:
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)
我想知道你是否可以给我一些关于如何大幅改进这段代码的提示(它真的很长,老师不会喜欢它)。
对于每个字符串,您可以遍历 0 和它的长度减去 ngram_size
加一之间的所有索引,并获得从该索引开始的子字符串。使用列表理解将所有这些放在一起实际上使它非常优雅:
result = [[e[i:i + ngram_size] for i in range(len(e) + 1 - ngram_size)] for e in corpus_2]
使用 itertools.<b>combinations</b>
的替代解决方案:
>>> 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']]