Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Быстрая обработка строк


Автор: DreamBit 14.4.2012, 15:49
Всем привет
Имеем список со следующими данными
Код

l = ['1', '01', '000', '10', ...]

Далее формируем строку из всего этого
Код

s = ''.join(l)


В итоге получаем строку '10100010'
Строка может очень большой, поэтому очень важен оптимальный алгоритм:
Необходимо имеющуюся строку разбить на части по 8 символов, а далее над этими частями работать, разбитые части нет необходимости хранить в памяти.
Так вот, возможностей много, а вот какой самый эффективный, хочется услышать от вас уважаемые форумчане.
Этап преобразование списка в строку необязателен, если все можно сделать на уровне списка
Всем большое спасибо

Автор: DreamBit 14.4.2012, 16:16
Пока остановился на 
Код

pattern = re.compile('\d{1,8}')

Автор: stalk13 14.4.2012, 17:27
Код

import wrap from textwrap
result = wrap(text, 8)

Автор: volatile 15.4.2012, 00:30
Цитата(DreamBit @  14.4.2012,  15:49 Найти цитируемый пост)
Этап преобразование списка в строку необязателен, если все можно сделать на уровне списка

Можно и без объединения. (Сэкономим на памяти)

Код

def splitter8 (l) :
  s = ''
  for next in l :
     s += next
     while len (s) >= 8 :
        yield s [:8]
        s = s [8:]
  if len (s) :
     yield s

l = ['1', '01', '000', '10',  '15675675220',  '10',  '10',  '101111111',  '133333330',  'AAAAAA10',  'EEEEEEE10',  '666666610',  '10', ]

for s in splitter8 (l) :
   print s

Выход:
Код

10100010
15675675
22010101
01111111
13333333
0AAAAAA1
0EEEEEEE
10666666
61010

Автор: Backward 17.4.2012, 02:28
Код

from itertools import chain, zip_longest

l = ['1', '01', '000', '10', '15675675220', '10', '10', '101111111', '133333330', 'AAAAAA10', 'EEEEEEE10', '666666610', '10']

for s in map("".join, zip_longest(*[iter(chain(*l))] * 8, fillvalue="")):
    print(s)


ЗЫ. для второй ветки map и zip_longest надо заменить на imap и izip_longest, соответственно

Автор: bilbobagginz 17.4.2012, 13:15
предыдущий вариант лучше. попитонистей.
(ИМХО)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)