python中如何将字符串划分为子字符串



我需要帮助找到一种更有效的方法将字符串分成所有可能的子字符串。该程序需要采用所需的字符串序列(例如GTCCAGCTTAAG),最大长度为12,最小长度为6。这个字符串需要通过减少长度来分隔(所以理想情况下它将在6处停止)。此外,所有反向的对应项都需要包含在此中(例如,对于10个字符长度,它将显示GTCCAGCTTA和CAGGTCGAAT),我可以想象通过循环。最后将它们放在一个列表中。

这是我迄今为止在尝试了许多不同但不成功的组合后得出的结论。这个返回的结果是最接近的,但仍然很乱:

tar = "GTCCAGCTTAAG"
def subs(tar):
substring = []
for i in range(len(tar)):
string_portion = tar[:i + 1]  
string_portion1 = tar[i:]     
substring.append(string_portion)
print(substring)
return 
subs(tar)

我想把一个字符串分成长度为6-12的所有子字符串。我还想要原始字符串并替换G/C A/T,并找到所有子字符串。

输入:actactg—>TGACTGAC

输出:[ACTGAC, ACTGACT, ACTGACTG, CTGACT…]

那么输出列表将按长度递减排序。

您可以使用islice form itertools创建递归生成器,从偏移起始位置并行压缩字符串,并将大小降低到最小6:

from itertools import islice
pairing = str.maketrans("GCAT","CGTA")
def getSubs(A,subLen=11,minLen=6,inverse=None):
subLen = min(subLen,len(A)-1)
if subLen<minLen: return
for s in map("".join,zip(*(islice(A,i,None) for i in range(subLen)))):
if inverse is not True:  yield s       # substring of length minLen
if inverse is not False: yield s.translate(pairing)  # it's inverse
yield from getSubs(A,subLen-1,minLen) # shorter substring lengths

这里的islice(A,i,None)是从位置i开始的遍历整个字符串的迭代器。*(... for i in range(subLen))部分创建subLen这样的迭代器,并将它们提供给zip()函数。由于每个迭代器的起始位置都比前一个迭代器远一个位置,zip()将生成与长度为subLen的所有子字符串对应的元组。这被映射到"".join,将元组转换回字符串。

子字符串s使用yield(这是一个生成器函数)输出,translate方法也用于输出每个子字符串的逆。

一旦所有长度为subLen的子字符串都被取出,递归到下一个更短的长度,直到达到长度为6的子字符串。

使用生成器函数的优点是,如果您将其应用于非常大的字符串,并且只是搜索给定模式的第一次出现,那么您可以扫描子字符串,而无需在内存中创建一个巨大的子字符串列表。并且,如果需要,您可以轻松地将结果放入列表(L = list(getSubs(tar)))中。

输出:

tar = "GTCCAGCTTAAG"
for s in getSubs(tar):print(s)
# you can call getSubs(tar,inverse=True) to get only the inverted substrings
# or call getSubs(tar,inverse=False) to get only the non-inverted substrings
# when the inverse parameter is not provided, you get both
GTCCAGCTTAA
CAGGTCGAATT
TCCAGCTTAAG
AGGTCGAATTC
GTCCAGCTTA
CAGGTCGAAT
TCCAGCTTAA
AGGTCGAATT
CCAGCTTAAG
GGTCGAATTC
GTCCAGCTT
CAGGTCGAA
TCCAGCTTA
AGGTCGAAT
CCAGCTTAA
GGTCGAATT
CAGCTTAAG
GTCGAATTC
GTCCAGCT
CAGGTCGA
TCCAGCTT
AGGTCGAA
CCAGCTTA
GGTCGAAT
CAGCTTAA
GTCGAATT
AGCTTAAG
TCGAATTC
GTCCAGC
CAGGTCG
TCCAGCT
AGGTCGA
CCAGCTT
GGTCGAA
CAGCTTA
GTCGAAT
AGCTTAA
TCGAATT
GCTTAAG
CGAATTC
GTCCAG
CAGGTC
TCCAGC
AGGTCG
CCAGCT
GGTCGA
CAGCTT
GTCGAA
AGCTTA
TCGAAT
GCTTAA
CGAATT
CTTAAG
GAATTC

使用python方式

>>> tar = "GTCCAGCTTAAG"
>>> k = 6
>>> K = 12
>>> res = [tar[i: j] for i in range(len(tar)) for j in range(i + 1, len(tar) + 1) if len(tar[i:j]) >= k and len(tar[i:j]) <= K]

>>> res
['GTCCAG', 'GTCCAGC', 'GTCCAGCT', 'GTCCAGCTT', 'GTCCAGCTTA', 'GTCCAGCTTAA', 'GTCCAGCTTAAG', 'TCCAGC', 'TCCAGCT', 'TCCAGCTT', 'TCCAGCTTA', 'TCCAGCTTAA', 'TCCAGCTTAAG', 'CCAGCT', 'CCAGCTT', 'CCAGCTTA', 'CCAGCTTAA', 'CCAGCTTAAG', 'CAGCTT', 'CAGCTTA', 'CAGCTTAA', 'CAGCTTAAG', 'AGCTTA', 'AGCTTAA', 'AGCTTAAG', 'GCTTAA', 'GCTTAAG', 'CTTAAG']

我不确定我完全理解你的问题,但我想我找到了一个解决办法:

tar = "GTCCAGCTTAAG"
def subs(tar, substring = [], sorted_list = []):
for i in range(len(tar)):
for n in range(len(tar)):
#Tries all possible solution and passes if len in lower than 6
#also passes if substring is None
if i >= n: 
pass
else:
a = tar[i:n]
if len(a) >= 6:
substring.append(a)
#Sorting the list
for i in range(11):
i +=6
for sub in substring:
if len(sub) == i:
sorted_list.append(sub)

return sorted_list

a = subs(tar)

最新更新