Как я мог перемешать Python бесконечный генератор - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть объект, который я превращаю в генератор:

class obj(object):
     def __init__():
         pass
     def __iter__():
         a = list(range(10))
         shuffle(a)
         for i in range(len(a)):
             yield a[i]
     .....

Видно, что при создании генератора происходит случайная операция. Когда я использую itertools.cycle, этот генератор может работать бесконечно, но оператор случайного воспроизведения не будет выполнен, кроме первого раза. Как я могу создать бесконечный генератор, который ведет себя как itertools.cycle, но все еще может реализовывать перемешивание в каждом цикле?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018
from random import shuffle

class my_generator():
    n = 10
    def __init__(self):
        pass

    def __iter__(self):
        a = list(range(self.n))
        shuffle(a)
        for i in range(len(a)):
            yield a[i]

    def get(self):
        my_list = []
        for i in range(self.n):
            my_list.append(self.__iter__().__next__())

        return my_list


obj =my_generator()
my_list = obj.get()
print(my_list)
0 голосов
/ 05 ноября 2018

Первое: не вызывайте ваш генератор __iter__, поскольку он зарезервирован для того, чтобы сделать экземпляры вашего объекта итеративными (без вызова определенного метода).

Для создания бесконечного списка значений вам на самом деле не нужно перемешивать. Вместо этого просто выберите случайное значение из списка каждый раз. Добавьте логику, если хотите, чтобы одно и то же значение было выбрано слишком рано после предыдущего такого же выбора, хотя чем больше вы его контролируете, тем менее случайным оно становится.

import random

class obj(object):
     def __init__(self):
         pass
     def items(self):  # Generator
         a = list(range(10))
         while True:
             yield random.choice(a)

Если ваш список a на самом деле представляет собой последовательность от 0 до 9 (включительно), то выполните:

     def items(self):  # Generator
         while True:
             yield random.randint(0, 10)

Если вы действительно хотите, чтобы все значения списка были созданы перед перезапуском, то имейте в виду, что последний выбор первого пакета может быть таким же, как первый выбор второго пакета. Во всяком случае, это будет выглядеть так:

     def items(self):  # Generator
         a = list(range(10))
         while True:
             shuffle(a)
             yield from a
...