【发布时间】:2017-07-31 03:32:03
【问题描述】:
我需要对列表进行任意次数的迭代,yield以随机顺序排列列表中的每个元素(每次遍历完整列表时使用不同的顺序)。我需要在第二次产生该元素之前产生每个元素一次,在第三次产生该元素之前产生每个元素两次,等等。
目前,我的代码如下所示:
def random_yield(data):
random.shuffle(data)
data_index = 0
while True:
yield data[data_index]
data_index += 1
if data_index == len(data):
random.shuffle(data)
data_index = 0
有没有办法更有效地做到这一点,所以我不会在每个 len(data) yields 之后支付 random.shuffle() 的性能损失?
【问题讨论】:
-
“我需要在第二次产生该元素之前产生每个元素一次......”什么?如果你第一次做某事,第二次你做了两次,只是为了记录。
-
我在列表中循环了任意次数。因此,如果列表是 [1,2,3],那么我可以产生
1, 2, 3, 2, 3, 1, 3, 2但不能产生1, 1, 1, 3, 2...不幸的是,这禁止了简单的解决方案,即随机选择一个索引并产生data[random_idx] -
这是一个旁白,但您的生成器实现可以大大简化(无需跟踪
data_index) -
随机洗牌恰好涉及“获取一个随机数并交换两个元素”的
n迭代,并且您每隔n收益率执行一次,因此平均每个收益率发生一次。您的“简单解决方案”涉及每次产量获得一个随机数。为什么你觉得其中一种效率很高,而另一种却非常慢?