#python #python-3.x #generator
#python #python-3.x #генератор
Вопрос:
stringlist = ['aanbetaal', 'aanbetaald', 'aanbetaalde', 'aanbetaalden', 'aanbetaalt', 'aanbetalen', 'aanbetaling', 'aanbetalingen', 'aanbeten', 'aanbeter', 'aanbeval', 'aanbevalen', 'aanbeveel', 'aanbeveelt', 'aanbevelen', 'aanbevelend', 'aanbevelende', 'aanbevelenswaard', 'aanbevelenswaardig', 'aanbevelenswaardige', 'aanbevelenswaardiger', 'aanbeveling', 'aanbevelingen', 'aanbevelingsbrief', 'aanbevelingsbriefje', 'aanbevelingsbrieven', 'aanbevelingscomité', 'aanbevelingscomités', 'aanbevolen', 'aanbevolenen', 'aanbid', 'aanbiddelijk', 'aanbiddelijke', 'aanbiddelijker', 'aanbiddelijkst', 'aanbiddelijkste', 'aanbidden', 'aanbiddend', 'aanbiddende', 'aanbidder', 'aanbidders', 'aanbidding', 'aanbiddingen', 'aanbiddingsleider', 'aanbiddingsleiders', 'aanbiddingslied', 'aanbiddingsteam', 'aanbidster', 'aanbidsters', 'aanbidt', 'aanbied', 'aanbieden', 'aanbiedend', 'aanbiedende', 'aanbieder', 'aanbieders', 'aanbiedersmarkt', 'aanbiedgedrag', 'aanbieding', 'aanbiedingen', 'aanbiedingsbrief', 'aanbiedingsbrieven', 'aanbiedingsfolder', 'aanbiedingsfolders', 'aanbiedingsnota', 'aanbiedingsplicht', 'aanbiedingsprijs', 'aanbiedingsprijzen', 'aanbiedingsvorm', 'aanbiedingsvormen', 'aanbiedstation', 'aanbiedt', 'aanbijt', 'aanbijten', 'aanbind', 'aanbinden', 'aanbindt', 'aanblaas', 'aanblaast']
maxchars = 150
runningcount = 0
tmpslice = []
for i, item in enumerate(stringlist):
runningcount = len(item)
if runningcount <= int(maxchars):
tmpslice.append(i)
else:
yield tmpslice
tmpslice = [i]
runningcount = len(item)
yield(tmpslice)
Я пытаюсь генерировать строки с границей из максимальных символов. Но я хочу, чтобы внутри списка были только полные слова.
Мой ожидаемый результат выглядит следующим образом:
tmpslice = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
[15, 16, 17, 18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29, 30, 31, 32, 33],
[34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 47],
[48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60],
[61, 62, 63, 64, 65, 66, 67, 68],
[69, 70, 71, 72, 73, 74, 75, 76, 77, 78]
]
Каждый список должен содержать столько элементов, пока не будет достигнута переменная maxchars . Приведенный выше код возвращает внешнюю функцию yield . Я новичок в программировании и Python, я не могу понять, почему.
Надеюсь, кто-нибудь знает, как это исправить? Спасибо
Комментарии:
1. Спасибо за быстрый ответ! Я понимаю, что вы говорите об использовании функции. Я попробовал первое решение, и, похоже, оно работает довольно хорошо. Я рассмотрю другие решения. Большое спасибо!!
Ответ №1:
У вас нет функции, поэтому вы не можете создать генератор ( yield
используется для реализации функций генератора; когда вы вызываете такую функцию, она возвращает итератор, который при повторении выполняет функцию до yield
тех пор, пока не будет получен результат, затем приостанавливается до запроса следующего элемента). Если вы просто хотите print
этого, сделайте print(tmpslice)
. Изменение кода на:
stringlist = [...]
maxchars = 150
runningcount = 0
tmpslice = []
for i, item in enumerate(stringlist):
runningcount = len(item)
if runningcount <= int(maxchars):
tmpslice.append(i)
else:
print(tmpslice)
tmpslice = [i]
runningcount = len(item)
print(tmpslice)
в основном получает результат, который вы ищете. Если вы хотите, чтобы он был упакован в a list
, вы бы сделали:
stringlist = [...]
maxchars = 150
runningcount = 0
tmpslice = []
allslices = []
for i, item in enumerate(stringlist):
runningcount = len(item)
if runningcount <= int(maxchars):
tmpslice.append(i)
else:
allslices.append(tmpslice)
tmpslice = [i]
runningcount = len(item)
allslices.append(tmpslice)
print(allslices)
таким образом, каждый новый tmpslice
сохраняется в единственном list
экземпляре, который вы print
в конце.
Наконец, если вы хотите использовать yield
, вы просто создадите правильную функцию генератора и вызовете ее:
stringlist = [... omitted for brevity ...]
def make_slices(strings, maxchars):
runningcount = 0
tmpslice = []
for i, item in enumerate(strings):
runningcount = len(item)
if runningcount <= int(maxchars):
tmpslice.append(i)
else:
yield tmpslice
tmpslice = [i]
runningcount = len(item)
yield tmpslice
for slc in make_slices(stringlist, 150):
print(slc)
Цикл при завершении make_slices
может быть изменен на allslices = list(make_slices(stringlist, 150))
, если вы хотите list
, а не распечатывать их.
Комментарии:
1. На самом деле вам не нужен
int(...)
inint(maxchars)
— как нигде, он всегда вводится какint
в любом случае…