Как я могу взять строку типа 'aaaaaaaaaaaaaaaaaaaaaaa'
и разделите его на 4 кортежа длиной, например (aaaa
, aaaa
, aaaa
)
Разделить строку на четные куски
Ответ 1
Используйте textwrap.wrap
:
>>> import textwrap
>>> s = 'aaaaaaaaaaaaaaaaaaaaaaa'
>>> textwrap.wrap(s, 4)
['aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaa']
Ответ 2
Используя понимание списка, выражение генератора:
>>> 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']
>>>
Ответ 4
Вы можете использовать рецепт grouper, 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
И рецепт grouper может работать с любым итератором, а textwrap
работает только со строками.
Ответ 5
s = 'abcdef'
Нам нужно разбить по частям 2
[s[pos:pos+2] for pos,i in enumerate(list(s)) if pos%2 == 0]
Ответ:
['ab', 'cd', 'ef']
Ответ 6
s = 'abcdefghi'
k - нет частей строки
k = 3
parts - список для хранения частей строки
parts = [s[i:i+k] for i in range(0, len(s), k)]
части → ['abc', 'def', 'ghi']