Нужно реализовать функцию Python itertools "цепочка" в классе - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь эмулировать функцию "цепочки" в itertools в python.

Я придумал следующий генератор.

# Chain make an iterator that returns elements from the first iterable
# until it is exhausted, then proceeds to the next iterable, until all
# of the iterables are exhausted.
def chain_for(*a) :
    if a :
       for i in a :
          for j in i :
             yield j
    else :
       pass    

Как я могу эмулировать ту же функцию в классе? Поскольку входные данные для функции - это произвольное количество списков, я не уверен, можно ли использовать упаковку / распаковку в классах, и если это так, я не уверен, как распаковать в методе ' init '.

class chain_for :
   def __init__(self, ...) :
      ....
   def __iter__(self) :
      self
   def __next__(self) :
      .....

Спасибо.

1 Ответ

1 голос
/ 27 октября 2019

Нет большой разницы между def chain_for(*a): и def __init__(self, *a):. Следовательно, очень грубый способ реализовать это может быть:

class chain_for:
    def __init__(self, *lists):
        self.lists = iter(lists)
        self.c = iter(next(self.lists))

    def __iter__(self):
        while True:
            try:
                yield next(self.c)
            except StopIteration:
                try:
                    self.c = iter(next(self.lists))
                except StopIteration:
                    break
                yield next(self.c)

chain = chain_for([1, 2], [3], [4, 5, 6])
print(list(chain))

Выходы:

[1, 2, 3, 4, 5, 6]
...