簡體   English   中英

我怎么能洗牌 python 無限生成器

[英]How could I shuffle python infinite generator

我有一個對象,我使它成為一個生成器:

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

可以看出在創建生成器的時候有一個shuffle操作。 當我使用itertools.cycle ,這個生成器可以無限工作,但除了第一次之外不會執行任何 shuffle 運算符。 我怎么能創建一個無限生成器,它的行為類似於itertools.cycle但仍然可以實現每個周期的 shuffle ?

首先:不要調用您的生成器__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
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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM