如何从列表中选择随机项目,同时避免连续选择相同的项目

时间:2016-01-13 14:54:41

标签: python list random

我想用随机值迭代列表。但是,我希望从列表中删除已选择的项目以进行下一次试用,以便我可以避免连续选择相同的项目;但它应该在之后再加回来。

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

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

4 个答案:

答案 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)