在Python上数三分之一

时间:2014-02-26 21:43:25

标签: python python-2.7 python-3.x

出于好奇,有没有一种方法在Python上计算机/程序可以计算三分之一而不使用范围,而是使用切片和索引?例如,如果您有一个像'CAGCAGCAT'这样的密码子怎么办? python可以将这个字符串分成三分之一:CAG CAG CAT?我试过,但我失败了。如果有办法,请告诉我如何。我很好奇

6 个答案:

答案 0 :(得分:3)

import textwrap
textwrap.wrap('CAGCAGCAT' ,3)

返回

['CAG', 'CAG', 'CAT']

答案 1 :(得分:2)

您可以使用grouper recipezip(*[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?

被盗