如何从列表中选择随机项目,同时避免在同一行中选取同一项目
问题描述:
我想用随机值遍历列表。但是,我希望将已挑选的项目从列表中移除,以便下次尝试,以便我可以避免在同一行中选取相同的项目;但应该在之后再加回去。如何从列表中选择随机项目,同时避免在同一行中选取同一项目
请帮助我展示这个简单的例子。 谢谢
import random
l = [1,2,3,4,5,6,7,8]
for i in l:
print random.choice(l)
答
对非唯一的元素列表两种工作以及:
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
答
你可以洗牌名单跑了在遍历列表之前,必须重复。然后,通过列表迭代后,对其进行排序得到它回到它的原始状态:
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]
答
画永远,永远不会选择同一项目连续两次:
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
答
编辑:作为注释解释说,这真的回答不同的问题:如何从N.
数组绘制M个不同的号码。如果你不介意使用numpy的,它有np.random.choice
这究竟是干什么的你想:
生成从给定的1-d阵列
指定replace=False
随机抽样确保每个元素只绘制一次。如果你绘制所有元素,这将有效地给你一个排列组合:
np.random.choice([1,2,3,4,5,6,7,8], 8, replace=False)
+1
此答案将从列表中选择项目,而不必选择相同的项目两次。然而,这不是问题的要求,因为它特别提到“这样我就可以避免在同一行中选择相同的项目;但它应该在”之后再次添加“。 – taleinat
定义你的意思后。如同在程序重启时一样?或者,它只能在下次尝试时被移除。 – disflux
输入值是否保证是唯一的?你会期望使用这种算法的toin coss产生严格的交替模式吗? – moooeeeep