Как бы я написал эту функцию генератора, вызвав iter явно, чтобы пропустить первые значения, которые не удовлетворяют предикату? - PullRequest
0 голосов
/ 12 июня 2018

Итак, я пытаюсь написать эту функцию генератора, и вот как я пытаюсь написать ее, но она не работает, и я не слишком уверен, как явно вызывать 'iter'.Будем благодарны за любую помощь!

Напишите генератор с именем skip_until, который принимает в качестве аргументов предикат и любые итерируемые;он пропускает создание начальных значений, созданных итерируемым, для которого предикат возвращает False, а затем создает первое значение, для которого предикат оценивается как True, и выдает все остальные после этого, удовлетворяют ли они предикату или нет.Например, повторение:

skip_until(lambda x: len(x) > 1, ['x', 'y', 'abc', 'a', 'xyz']) 

пропустит создание 'x' и 'y' (потому что их длины не> 1), но затем выдаст значения 'abc', 'a', а затем 'xyz '(потому что' abc 'является первым значением, длина которого> 1, поэтому оно и все последующие значения создаются. Вызовите iter явно.' ''

def skip_until(p,iterable)
    for i in range(iterable):
      if p(i) == True:
        for x in range(i,len(iterable)):
           print(x)
      else: 
        pass

Как я могу вызвать iter явно, чтобы получитьправильные результаты?

1 Ответ

0 голосов
/ 12 июня 2018

Во-первых, нет причин заново изобретать колесо.Посмотрите на itertools.dropwhile и просто инвертируйте свой предикат.

Во-вторых, если вы собираетесь иметь дело с итераторами, то вы не можете предполагать, что они срезаны или чтоВы можете получить их длины.В основном, единственное, что вы можете сделать, чтобы получить значения, это for loop, next и yield from.

Кроме того, и я не хочу, чтобы здесь звучало снисходительно, все, что вам нужно сделать, чтобывызов iter явно равен iter(iterable).Это возвращает итератор над вашей итерацией .

def skip_until(p,iterable):
    try:
        it = iter(iterable)
        curr = next(it)
        while not p(curr):
          curr = next(it)
        yield curr
        yield from it
    except StopIteration:
        return 

print(list(skip_until(lambda x: len(x) > 1, ['x', 'y', 'abc', 'a', 'xyz'])))
# ['abc', 'a', 'xyz']
...