Wie könnte ich einen String wie 'aaaaaaaaaaaaaaaaaaaaaaa'
in 4er-Tupel aufteilen, z.B. in (aaaa
, aaaa
, aaaa
)?
Antworten
Zu viele Anzeigen?Verwenden Sie textwrap.wrap
:
>>> import textwrap
>>> s = 'aaaaaaaaaaaaaaaaaaaaaaa'
>>> textwrap.wrap(s, 4)
['aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaaa', 'aaa']
falsetru
Punkte
353059
Mit List Comprehension und Generatorausdruck:
>>> 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')
James
Punkte
14623
unutbu
Punkte
769083
Sie könnten das grouper recipe verwenden, 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']
Beachten Sie, dass textwrap.wrap
s
nicht in Zeichenfolgen der Länge 4 aufteilen kann, wenn die Zeichenfolge Leerzeichen enthält:
In [43]: textwrap.wrap('I am a hat', 4)
Out[43]: ['I am', 'a', 'hat']
Das grouper-Rezept ist schneller als die Verwendung von 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 pro Schleife
In [117]: %timeit textwrap.wrap(s, 4)
10000 loops, best of 3: 32.5 µs pro Schleife
Und das grouper-Rezept kann mit jedem Iterator verwendet werden, während textwrap
nur mit Zeichenfolgen funktioniert.
Himanshu
Punkte
666
- See previous answers
- Weitere Antworten anzeigen