出于好奇,有没有一种方法在Python上计算机/程序可以计算三分之一而不使用范围,而是使用切片和索引?例如,如果您有一个像'CAGCAGCAT'这样的密码子怎么办? python可以将这个字符串分成三分之一:CAG CAG CAT?我试过,但我失败了。如果有办法,请告诉我如何。我很好奇
答案 0 :(得分:3)
import textwrap
textwrap.wrap('CAGCAGCAT' ,3)
返回
['CAG', 'CAG', 'CAT']
答案 1 :(得分:2)
您可以使用grouper recipe,zip(*[iterator]*n)
来收集项目,而无需使用range
。
In [96]: data = 'CAGCAGCAT'
In [97]: [''.join(grp) for grp in zip(*[iter(data)]*3)]
Out[97]: ['CAG', 'CAG', 'CAT']
如果len(data)
不是3的倍数,那么上面的剩余部分就会截止。为防止这种情况,请使用itertools.izip_longest:
In [102]: import itertools as IT
In [108]: [''.join(grp) for grp in IT.izip_longest(*[iter('CAGCAGCATCA')]*3, fillvalue='')]
Out[108]: ['CAG', 'CAG', 'CAT', 'CA']
顺便说一句,石斑鱼配方适用于任何迭代器。 textwrap.wrap
仅适用于字符串。此外,石斑鱼配方更快:
In [100]: %timeit textwrap.wrap(data, 3)
10000 loops, best of 3: 17.7 µs per loop
In [101]: %timeit [''.join(grp) for grp in zip(*[iter(data)]*3)]
100000 loops, best of 3: 1.78 µs per loop
另请注意,如果字符串包含空格,textwrap.wrap
可能无法将字符串分组为3个字符的组:
In [42]: textwrap.wrap('I am a hat', 3)
Out[42]: ['I', 'am', 'a', 'hat']
答案 2 :(得分:1)
>>> s = 'CAGCAGCAT'
>>> [''.join(g) for g in zip(s[::3], s[1::3], s[2::3])]
['CAG', 'CAG', 'CAT']
答案 3 :(得分:1)
你可以使用列表理解,范围的第三个参数是一个步骤:
>>> s = "CAGCAGCAT"
>>> [s[i:i+3] for i in range(0, len(s), 3)]
['CAG', 'CAG', 'CAT']
>>>
答案 4 :(得分:1)
您可以使用grouper
itertools
recipe:
>>> s = 'CAGCAGCAT'
>>> list(grouper(s, 3))
[('C', 'A', 'G'), ('C', 'A', 'G'), ('C', 'A', 'T')]
或者在您的情况下,您也可以使用简单的切片:
>>> [s[i:i+3] for i in range(0, len(s), 3)]
['CAG', 'CAG', 'CAT']
答案 5 :(得分:1)
def chunker(seq, size):
return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))
从What is the most "pythonic" way to iterate over a list in chunks?
被盗