Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
1

Реализация генератора для разбивки текста на блоки

16.04.2017, 21:36. Показов 1254. Ответов 2

Author24 — интернет-сервис помощи студентам
Есть вот такой генератор, который разбивает переданный в виде коллекции (в данном случае Word sentences) текст на блоки размером не более, чем указанное число символов в chars.
Так как на каждой итерации может оставаться часть текста не вошедшая в порцию для yield, то он просто добавляется в переменную text, в которую будет писаться следующая порция текста на следующей итерации.
Выглядит не очень хорошо, и хотелось бы просто передавать генератору стартовый индекс уменьшенный на единицу - чтобы захватывать не вошедшие на пред. итерации порции текста.
Но как тут использовать send - не понимаю.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def gen_split_text(start,sentences,count,chars=500):
    text = ''
    prev = 0
    start = start
    try:
        for i in range(start,count + 1):
            prev = start
            temp = sentences(i).Text
                
            if (len(text) + len(temp)) < chars:
                text += temp
                # вывод итерационных порций текста
                print('[{:03}][{}]{}'.format(i,start,temp.strip()))
            else:
                yield (i,len(text),text) # возврат в виде кортежа с тремя значениями
                #start = i - 1   # так не работает
                text = ''
                text += temp  # поэтому просто присоединяем не вошедший текст, чтобы он не потерялся
            
        yield (i,len(text),text) # возврат всего текста если он по размеру меньше, чем блок для разбивки.
    
    except Exception as err:
        print(err)
Вопрос: как такой генератор сделать более грамотно?

Добавлено через 36 минут
Переписал на while вместо range:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def gen_split_text(start,sentences,count,chars=500):
    text = ''
    prev = 0
    start = start
    try:
        while start < (count + 1):
        #for i in range(start,count + 1):
            prev = start
            temp = sentences(start).Text
            start += 1    
            if (len(text) + len(temp)) < chars:
                text += temp
                # вывод итерационных порций текста
                print('[{:03}]{}'.format(start,temp.strip()))
            else:
                yield (start,len(text),text)
                start -= 1 
                text = ''
                #text += temp
            
        yield (start,len(text),text)
    
    except Exception as err:
        print(err)
Вроде получше, однако все равно так и не понял как сюда можно send приделать - если, конечно, имеет смысл.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2017, 21:36
Ответы с готовыми решениями:

Ускорить алгоритм разбивки строк на блоки
Помогіте оптімізіровать алгорітм. Смысл такой.. есть строкі... в ніх сначала текст.. потом...

Разработать алгоритм и программу для разбивки текста на строки
Разработать алгоритм и программу для разбивки текста на строки (как признак конца строки в тексте...

[Trace mode] Реализация калькулятора. Выбрать компонент для генератора входного сигнала
Здравствуйте! Перечитала методичку и справку в Trace mode, примера такого не видела. Не могу...

Создание генератора текста для yaml
Здравствуйте, человеки. На форум зашел с 1 единственным вопросом: Как сделать так, чтобы при...

Макрос разбивки текста в ячейке
Добрый день! Возникло непреодалимое желание разбить текст в 1 ячейке на несколько ячеек. Текс =...

2
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
16.04.2017, 21:50 2
Garry Galler, можешь попробовать использовать itertools.islice. Как-то использовал ее, чтобы сделать подобное.
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
17.04.2017, 01:05  [ТС] 3
alex925,
К islice я присматривался - только у меня ведь итерация по коллекции (у word-а она к тому еще и не Iterable - нужно перегонять) только первый этап, а просто slice мне ничего не дает. Я тут подумал, что было бы неплохо для такой задачи как-то объединенить accumulate(), которая будет через lambda агрегировать элементы коллекции, а затем отдавать takewhile с предикатом брать пока не дорого превышен лимит :-)
0
17.04.2017, 01:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2017, 01:05
Помогаю со студенческими работами здесь

Реализация QR генератора
Добрый день! :senor: Очень нужна помощь O_o Кто нибудь реализовал генератор QR кодов в c++...

Реализация функции-генератора
Реализуйте функцию-генератор, который производит бесконечную рекуррентную последовательность: ...

Реализация простейшего генератора пароля
Нужно реализовать программу на C#, которая генерирует пароль при определенных условиях. Условия...

Реализация генератора случайных лабиринтов
Пытаюсь сделать небольшую игру, в качестве основного места действия необходим случайный лабиринт....

Реализация генератора экспоненциальных колебаний
На микроконтроллера PIC16F84A нужно реализовать генератора экспоненциальных колебаний. Картинку...

Реализация простейшего генератора паролей
Здравствуйте программисты, не могу понять задачу, есть код в С#, но в данный момент нужен в Delphi....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru