Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая обработка строк 
:(
    Опции темы
DreamBit
  Дата 14.4.2012, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



Всем привет
Имеем список со следующими данными
Код

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

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

s = ''.join(l)


В итоге получаем строку '10100010'
Строка может очень большой, поэтому очень важен оптимальный алгоритм:
Необходимо имеющуюся строку разбить на части по 8 символов, а далее над этими частями работать, разбитые части нет необходимости хранить в памяти.
Так вот, возможностей много, а вот какой самый эффективный, хочется услышать от вас уважаемые форумчане.
Этап преобразование списка в строку необязателен, если все можно сделать на уровне списка
Всем большое спасибо
PM MAIL   Вверх
DreamBit
Дата 14.4.2012, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



Пока остановился на 
Код

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

PM MAIL   Вверх
stalk13
Дата 14.4.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.5.2011

Репутация: нет
Всего: нет



Код

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

PM MAIL   Вверх
volatile
Дата 15.4.2012, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(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

PM MAIL   Вверх
Backward
Дата 17.4.2012, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 5.6.2007

Репутация: 2
Всего: 2



Код

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, соответственно
PM MAIL   Вверх
bilbobagginz
Дата 17.4.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 6
Всего: 317



предыдущий вариант лучше. попитонистей.
(ИМХО)



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0914 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.