Форум сайта python.su
0
Нужно разбить строку произвольной длины на подстроки одинаковой длины.
Набросал функцию, но терзают сомнения, что есть либо билтин, либо более красивое решение.
Вообщем, присылайте свои версии.
Минусы моего решения: если длина строки кратна длине желаемых подстрок, получаем пустую строку в конце.
def cut(string, n):
parts = len(string)//n
arr = []
for count in xrange(parts):
arr.append(s[n*count:n*count + n])
arr.append(s[n*(count+1):])
return arr
Офлайн
10
Офлайн
26
Скорее всего более правильным решением будет создание генератора, так как этот список будет обрабатываться циклом for. Но даже если это и не так, попробуйте выполнить следующий код:
# -*- coding: utf-8 -*-
import timeit
def div_str(string, part_lenght):
for n in xrange(len(string)//part_lenght):
yield string[n * part_lenght : (n+1) * part_lenght]
if string[(n+1) * part_lenght : (n+2) * part_lenght]:
yield string[(n+1) * part_lenght : (n+2) * part_lenght]
print list(div_str("0123456789", 4))
print list(div_str("0123456789", 2))
print timeit.Timer('for _ in div_str("0123456789" * 10000, 30): pass',
'from __main__ import div_str').timeit(1000)
print timeit.Timer('list(div_str("0123456789" * 10000, 30))',
'from __main__ import div_str').timeit(1000)
print '-=-' * 10
def div_str(string, part_lenght):
from cStringIO import StringIO
sio = StringIO(string)
while True:
d = sio.read(part_lenght)
if not d:
return
yield d
print list(div_str("0123456789", 4))
print list(div_str("0123456789", 2))
print timeit.Timer('for _ in div_str("0123456789" * 10000, 30): pass',
'from __main__ import div_str').timeit(1000)
print timeit.Timer('list(div_str("0123456789" * 10000, 30))',
'from __main__ import div_str').timeit(1000)
print '-=-' * 10
from textwrap import wrap
print wrap("0123456789", 4)
print wrap("0123456789", 2)
print timeit.Timer('for _ in wrap("0123456789" * 10000, 30): pass',
'from textwrap import wrap').timeit(1000)
Офлайн
0
s = 'Testosterone is a steroid hormone from the androgen group...'
step = 4
print [s[i:i+step] for i in xrange(0, len(s), step)]
s = 'Testosterone is a steroid hormone from the androgen group...'
step = 4
it = (s[i:i+step] for i in xrange(0, len(s), step)])
print list(it)
Отредактировано (Дек. 12, 2008 06:26:17)
Офлайн
26
Красиво и офифигительно быстро!
# -*- coding: utf-8 -*-
import timeit
string = "0123456789" * 10000
step = 30
print timeit.Timer('[string[i:i+step] for i in xrange(0, len(string), step)]',
'from __main__ import string, step').timeit(1000)
print timeit.Timer('for _ in (string[i:i+step] for i in xrange(0, len(string), step)): pass',
'from __main__ import string, step').timeit(1000)
Отредактировано (Дек. 12, 2008 06:39:27)
Офлайн
0
Вариант shiza классный, к чему-то такому шел, но не дошел :)
Спасибо всем за решения!
Офлайн