如何从列表中选择随机项目,同时避免在同一行中选取同一项目

问题描述:

我想用随机值遍历列表。但是,我希望将已挑选的项目从列表中移除,以便下次尝试,以便我可以避免在同一行中选取相同的项目;但应该在之后再加回去。如何从列表中选择随机项目,同时避免在同一行中选取同一项目

请帮助我展示这个简单的例子。 谢谢

import random 
    l = [1,2,3,4,5,6,7,8] 
    for i in l: 
     print random.choice(l) 
+2

定义你的意思后。如同在程序重启时一样?或者,它只能在下次尝试时被移除。 – disflux

+2

输入值是否保证是唯一的?你会期望使用这种算法的toin coss产生严格的交替模式吗? – moooeeeep

对非唯一的元素列表两种工作以及:

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] 
+2

这不是问题所要求的,因为它特别提到“这样我就可以避免在同一行中选取同一个项目;但它应该在之后再次添加”。 – taleinat

+0

这不会连续两次选取同一个项目? – gtlambert

+0

它将从列表中选择项目,而不必选择相同的项目两次。 – taleinat

画永远,永远不会选择同一项目连续两次:

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