Как бы я отбросил последние x символов строки в качестве генератора питона при использовании вызовов iter и while? - PullRequest
0 голосов
/ 31 октября 2018

У меня проблемы с написанием функции генератора, которая принимает итеративный и еще один параметр, который является целым числом x. Он выводит каждое значение, кроме последних значений x. Он не знает, как посчитать, сколько значений повторяется.

Я не знаю, как это сделать, используя цикл while и iter. Мне также нужно использовать понимание, которое создает список для хранения максимум х значений.

Допустим, мы звоним:

for i in func_function(“abcdefghijk”,5):
print(i,end =”)

Следует напечатать abcdef.

Вот что я пробовал:

def func_function(iterable, x):
    while True:
        l = []
        for x in iter(iterable):
            if len(x) == x:
               yield x

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Строки могут быть срезаны:

def func_function(iterable, x):
    yield from iterable[:-x]

print(func_function("asdfgkjbewqrfgkjb",8))

k = list(func_function("asdfgkjbewqrfgkjb",8))    
print(k) # ['a', 's', 'd', 'f', 'g', 'k', 'j', 'b', 'e']

Цикл while, iter и l=[] не нужны ...

0 голосов
/ 31 октября 2018
from collections import deque

def drop_last_few(iterable, x=5):
    it = iter(iterable)
    data = deque(maxlen=x)
    data.extend([next(it) for i in range(x)])
    for val in it:
        yield data[0]
        data.append(val)

При этом используется двусторонняя очередь в качестве хранилища для кэширования максимум x элементов. Демонстрация:

>>> print(*drop_last_few("abcdefghijk", 5))
a b c d e f
0 голосов
/ 31 октября 2018

Хитрость заключается в том, чтобы превратить это из взгляда в взгляд назад.

Я бы сделал это путем перебора входных данных и сохранения окна самых последних n элементов:

def except_last_n(iterable, n):
  last_n = []
  for val in iterable:
    last_n.append(val)
    if len(last_n) > n:
      yield last_n.pop(0)

for val in except_last_n(range(10), 3):
  print(val)

Переписав это в виде цикла while и iter, оставьте читателю в качестве упражнения.

def except_last_n(iterable, n):
  last_n = [val for val in iterable]
  if len(last_n) > n:
      yield last_n.pop(0)
...