[英]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.