2014-01-25 2 views
7

Как бы я быть в состоянии взять строку как 'aaaaaaaaaaaaaaaaaaaaaaa' и разделить его на 4 длины кортежей типа (aaaa, aaaa, aaaa)Разделить строку даже размера куски

+1

для х в х: X = S [0: 4]; S = S [4: ]; print (x) –

+0

связанный: [Что является самым «питоновым» способом перебора списка в кусках?] (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 recipe, zip(*[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'] 
Смежные вопросы