2014-01-25 24 views
7

我如何将能够获得一个字符串像'aaaaaaaaaaaaaaaaaaaaaaa' 并分成4个长度元组像(aaaaaaaaaaaa拆分一个字符串,即使大小的块

+1

中代表S X:X = S [0:4]; S = S [4: ]; print(x) –

+0

相关:[什么是最大的“pythonic”方法来遍历一个列表大块?](http://stackoverflow.com/q/434287/4279) – jfs

回答

13

使用textwrap.wrap

>>> import textwrap 
>>> s = 'aaaaaaaaaaaaaaaaaaaaaaa' 
>>> textwrap.wrap(s, 4) 
['aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaa'] 
9

使用列表理解,发电机表达:

>>> s = 'aaaaaaaaaaaaaaaaaaaaaaa' 
>>> [s[i:i+4] for i in range(0, len(s), 4)] 
['aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaa'] 

>>> tuple(s[i:i+4] for i in range(0, len(s), 4)) 
('aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaa') 

>>> s = 'a bcdefghi j' 
>>> tuple(s[i:i+4] for i in range(0, len(s), 4)) 
('a bc', 'defg', 'hi j') 
3

另一种解决方案使用正则表达式:

>>> s = 'aaaaaaaaaaaaaaaaaaaaaaa' 
>>> import re 
>>> re.findall('[a-z]{4}', s) 
['aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaaa'] 
>>> 
+3

正则表达式有点矫枉过正为了这。 – poke

+0

店主正在寻求一个解决方案,而不是要求最优化的解决方案,所以我只是放了我们也可以这样解决。没关系,我知道它不是最好的。 –

+0

实际上,这是一个非常好的解决方案(除了正常表达式在批量使用时速度较慢)并且比zip()解决方案更容易一眼看出。它可以很容易地更改为使用任意字符,包括换行符:'re.findall('。{4}',s,re.DOTALL)' - 或者甚至接受不完整的尾部:'re.findall('。{1 ,4}',s,re.DOTALL)' – blubberdiblub

2

你可以使用grouper recipezip(*[iter(s)]*4)

In [113]: s = 'aaaaaaaaaaaaaaaaaaaaaaa' 

In [114]: [''.join(item) for item in zip(*[iter(s)]*4)] 
Out[114]: ['aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaaa'] 

注意textwrap.wrap可能不分裂s为长度为4的字符串如果字符串包含空格:

In [43]: textwrap.wrap('I am a hat', 4) 
Out[43]: ['I am', 'a', 'hat'] 

石斑鱼食谱比使用textwrap快:

In [115]: import textwrap 

In [116]: %timeit [''.join(item) for item in zip(*[iter(s)]*4)] 
100000 loops, best of 3: 2.41 µs per loop 

In [117]: %timeit textwrap.wrap(s, 4) 
10000 loops, best of 3: 32.5 µs per loop 

而石斑鱼配方可以与任何迭代器一起使用,而textwrap只适用于字符串。

+0

这是天才! –

0
s = 'abcdef' 

我们需要在2

[s[pos:pos+2] for pos,i in enumerate(list(s)) if pos%2 == 0] 

回答份分裂:

['ab', 'cd', 'ef']