How would I be able to take a string like 'aaaaaaaaaaaaaaaaaaaaaaa'
and split it into 4 length tuples like (aaaa,aaaa,aaaa)
24
votes
for x in s:x = s[0:4];s = s[4:];print(x)
- Swaroop Nagendra
related: What is the most “pythonic” way to iterate over a list in chunks?
- jfs
Does this answer your question? Split string every nth character?
- AMC
9 Answers
32
votes
Use textwrap.wrap:
>>> import textwrap
>>> s = 'aaaaaaaaaaaaaaaaaaaaaaa'
>>> textwrap.wrap(s, 4)
['aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaa']
18
votes
Using list comprehension, generator expression:
>>> 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')
5
votes
4
votes
You could use the 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']
Note that textwrap.wrap may not split s into strings of length 4 if the string contains spaces:
In [43]: textwrap.wrap('I am a hat', 4)
Out[43]: ['I am', 'a', 'hat']
The grouper recipe is faster than using 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
And the grouper recipe can work with any iterator, while textwrap only works with strings.
0
votes
0
votes
0
votes
I think this method is simpler. But the message length must be split with split_size. Or letters must be added to the message. Example: message = "lorem ipsum_" then the added letter can be deleted.
message = "lorem ipsum"
array = []
temp = ""
split_size = 3
for i in range(1, len(message) + 1):
temp += message[i - 1]
if i % split_size == 0:
array.append(temp)
temp = ""
print(array)
Output: ['lor', 'em ', 'ips']
0
votes
Here's another possible solution to the given problem:
def split_by_length(text, width):
width = max(1, width)
chunk = ""
for v in text:
chunk += v
if len(chunk) == width:
yield chunk
chunk = ""
if chunk:
yield chunk
if __name__ == '__main__':
x = "123456789"
for i in range(20):
print(i, list(split_by_length(x, i)))
Output:
0 ['1', '2', '3', '4', '5', '6', '7', '8', '9']
1 ['1', '2', '3', '4', '5', '6', '7', '8', '9']
2 ['12', '34', '56', '78', '9']
3 ['123', '456', '789']
4 ['1234', '5678', '9']
5 ['12345', '6789']
6 ['123456', '789']
7 ['1234567', '89']
8 ['12345678', '9']
9 ['123456789']
10 ['123456789']
11 ['123456789']
12 ['123456789']
13 ['123456789']
14 ['123456789']
15 ['123456789']
16 ['123456789']
17 ['123456789']
18 ['123456789']
19 ['123456789']
0
votes