Python возвращает список фрагментов для печати на основе границы длины строки maxchars

#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(...) in int(maxchars) — как нигде, он всегда вводится как int в любом случае…