0

我无法有效地运行这个嵌套的 for 循环。我需要在长度约为 90,000 的字符串 s 上运行此循环。任何人都可以提供任何提示吗?

该代码应该采用一个字符串,并将其切成 n 长的片段,以便这些片段是原始字符串的连续部分。然后程序返回每个集合的大小,最多为字符串的长度。

例如:n = 2 的 GATTACAT 将产生 {'GA', 'AT', 'TT', 'TA', 'AC', 'CA', 'AT' }。它将采用 this so {'GA', 'AT', 'TT', 'TA', 'AC', 'CA'} 的集合并返回其长度。

程序是从 n = 0 到 n = len('GATTACAT') 执行此操作,并对所有设置的长度求和。

for m in range(1, len(s)+1):
    sublist = list()
    for n in range(0, len(s)-m+1):
        sublist.append(''.join(ind[n:n+m]))
    sumS += len(set(sublist))

谢谢!

4

2 回答 2

1

一些快速的想法浮现在脑海:

slen = 1 + len(s) # do this once, not a bunch of times in the loop
for m in range(1, slen):
    sublist = [''.join(ind[n:n+m]) for n in range(slen-m))] # list comps are usually faster than loops
    sumS += len(set(sublist))

实际上,您可能可以将其理解为更大的理解:

slen = 1 + len(s)
sumS += sum(len(set(''.join(ind[n:n+m]) for n in range(slen-m))) for m in range(1,slen))

如果您有 Python 3,请使用集合推导而不是上面的列表推导。

于 2013-10-15T03:36:35.420 回答
0
>>> s = 'GATTACAT'

>>> [s[i:i+2] for i in range(len(s)-1)]
['GA', 'AT', 'TT', 'TA', 'AC', 'CA', 'AT']

>>> [s[i:i+3] for i in range(len(s)-2)]
['GAT', 'ATT', 'TTA', 'TAC', 'ACA', 'CAT']
于 2013-10-15T03:38:10.930 回答