我想用随机值迭代列表。但是,我希望从列表中删除已选择的项目以进行下一次试用,以便我可以避免连续选择相同的项目;但它应该在之后再加回来。
请帮我展示这个简单的例子。 谢谢
import random
l = [1,2,3,4,5,6,7,8]
for i in l:
print random.choice(l)
答案 0 :(得分:9)
两者都适用于非独特元素的列表:
def choice_without_repetition(lst):
prev = None
while True:
i = random.randrange(len(lst))
if i != prev:
yield lst[i]
prev = i
或
def choice_without_repetition(lst):
i = 0
while True:
i = (i + random.randrange(1, len(lst))) % len(lst)
yield lst[i]
用法:
lst = [1,2,3,4,5,6,7,8]
for x in choice_without_repetition(lst):
print x
答案 1 :(得分:1)
您可以在遍历列表之前随机地随机播放列表。然后,在遍历列表之后,对其进行排序以使其恢复到原始状态:
import random
l = [1,2,3,4,5,6,7,8]
random.shuffle(l)
for element in l:
print(element)
l = sorted(l)
print(l)
<强>输出强>
3
2
8
6
7
5
1
4
[1, 2, 3, 4, 5, 6, 7, 8]
答案 2 :(得分:1)
永远画画,永远不要连续两次选择相同的项目:
import random
def choice_no_repeat(lst):
random.shuffle(lst)
last = lst[0]
lst.pop(0)
yield last
while True:
random.shuffle(lst)
last, lst[0] = lst[0], last
yield last
choice = choice_no_repeat([1, 2, 3, 4, 5, 6, 7, 8])
for _ in range(10):
print(next(choice))
示例输出:
1
6
1
3
8
7
4
7
1
8
答案 3 :(得分:0)
编辑:正如评论所解释的,这真的回答了一个不同的问题:如何从N数组中绘制M个不同的数字。
如果您不介意使用numpy,它会SO answer完全符合您的要求:
从给定的1-D数组生成随机样本
指定replace=False
可确保每个元素仅绘制一次。如果你绘制所有元素,这将有效地给你一个排列:
np.random.choice([1,2,3,4,5,6,7,8], 8, replace=False)