题 如何从Python中的列表中选择“x”个唯一数字?


我需要从列表中挑出“x”个非重复的随机数。例如:

all_data = [1, 2, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15]

我该如何挑选出类似的列表 [2, 11, 15] 并不是 [3, 8, 8]


23
2018-06-27 14:32


起源


或者[9,9,9,9 ......]: dilbert.com/strips/comic/2001-10-25 - Mark Ransom
@Mark你,先生已经结束了我的一天。 - janislaw


答案:


那正是如此 random.sample() 确实。

>>> random.sample(range(1, 16), 3)
[11, 10, 2]

编辑:我几乎可以肯定这是不是你问什么,但我被推到包括此评论:如果人口要从包含重复取样品,你必须先删除它们:

population = [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
population = set(population)
samples = random.sample(population, 3)

44
2018-06-27 14:33



不,不是很:“人口的成员不必是哈希的或唯一的。如果群包含重复,那么每一次出现是在样品中一个可能的选择。”
@delnan:虽然原始列表可能包含重复内容,但这似乎并不是OP所要求的。 - Sven Marnach
谢谢你,你解决了我的问题。我的列表确实包含重复项。再次感谢你 - George
一个简单但重要的问题的优雅答案。 - Farsheed


像这样的东西:

all_data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
from random import shuffle
shuffle(all_data)
res = all_data[:3]# or any other number of items

要么:

from random import sample
number_of_items = 4
sample(all_data, number_of_items)

如果all_data可能包含重复的条目而不是修改代码以首先删除重复项,然后使用shuffle或sample:

all_data = list(set(all_data))
shuffle(all_data)
res = all_data[:3]# or any other number of items

3
2018-06-27 14:35



这仍然可以产生重复的值 - inspectorG4dget
哪一个样本可以产生重复? - Artsiom Rudzenka
问题是您正在使用该列表 all_data,可能包含重复项。因此,一个 random.choice 从 all_data 要么 random.shuffle(all_data)[:n] 可能包含重复值。因此,消除这个问题的正确方法是使用a set 的 all_data - inspectorG4dget
我知道,谢谢你,我用给定信息创建我的样本,也没有信息,有可能在all_data重复的条目,这就是为什么我假设笔者了解一套,反正我已经修改我的代码,谢谢你通知我关于我周的地方 - Artsiom Rudzenka
+1修复编辑 - inspectorG4dget


其他人建议你使用 random.sample。虽然这是一个有效的建议,但每个人都忽略了一个微妙之处:

如果人口包含重复,   然后每次出现都是可能的   选择样本。

因此,您需要将列表转换为集合,以避免重复的值:

import random
L = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
random.sample(set(L), x) # where x is the number of samples that you want

2
2018-06-27 14:37



random.choice() 期待一个序列。也许你应该在发布前测试你的代码。 (顺便说一下,不是我的downvote。) - Sven Marnach
指出。我意识到刚刚发布代码并在后续编辑中更改了它 - inspectorG4dget
固定样本+1 - Artsiom Rudzenka


另一种方式,当然使用所有解决方案,您必须确保原始列表中至少有3个唯一值。

all_data = [1,2,2,3,4,5,6,7,8,8,9,10,11,11,12,13,14,15,15]
choices = []
while len(choices) < 3:
    selection = random.choice(all_data)
    if selection not in choices:
        choices.append(selection)
print choices 


1
2018-06-27 18:08





您还可以使用生成随机选择列表 itertools.combinations 和 random.shuffle

all_data = [1,2,2,3,4,5,6,7,8,8,9,10,11,11,12,13,14,15,15]

# Remove duplicates
unique_data = set(all_data)

# Generate a list of combinations of three elements
list_of_three = list(itertools.combinations(unique_data, 3))

# Shuffle the list of combinations of three elements
random.shuffle(list_of_three)

输出:

[(2, 5, 15), (11, 13, 15), (3, 10, 15), (1, 6, 9), (1, 7, 8), ...]

1
2018-06-27 20:37