我想从列表中随机 select 项目并将它们添加到另一个列表而不需要替换

I want to randomly select items from a list and add them to another list without replacement

我正在尝试从列表中随机 select 项并将它们添加到另一个列表。

我选择的元素列表如下所示:

data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54]

我想从这个列表中随机取出一个元素并将其添加到四个列表之一,直到每个列表的元素数量相同。

lists=[[1,'x','x','x','x','x'],[3,'x','x','x','x','x'],[5,'x','x','x','x','x'],[7,'x','x','x','x','x']]

我试过使用 random.choice 但这给了我重复项:

def fill_lists(data):
for list in lists:
    for n,i in enumerate(list):
        if i=='x':
            list[n]= random.choice(data)

我希望我的函数 return 包含 4 个列表的列表,每个列表包含数据列表的随机样本,没有重复项。我还希望每个列表的第一个元素是我已经放入列表中的值。

您可以使用 random.sample:

 data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54]
 random.sample(data, 5)
 # [27, 12, 33, 24, 17]

要获取它的嵌套列表,请使用列表理解

 [random.sample(data, 5) for _ in range(5)]
 # [[40, 35, 24, 54, 17],
 #  [17, 54, 35, 43, 37],
 #  [40, 4, 43, 33, 44],
 #  [51, 37, 35, 33, 8],
 #  [54, 4, 44, 27, 50]]

编辑:以上不会为您提供唯一值;对于唯一值,您应该接受上述答案。我把问题解释错了!

import random
data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54]
random.shuffle(data)
lists = [data[i:i+len(data)/4] for i in range(0, len(data), len(data)/4)]
print(lists)

从您的初始列表中随机抽取与先洗牌然后按顺序抽取的效果相同。然后可以拆分成子列表。如果您需要对子列表进行排序,之后只需对列表进行映射排序即可。

您可以通过更改 len(data)/4

的除数来更改组数

编辑:我错过了你问题的这一部分:

heads = [1,3,5,7]
[q.insert(0,p) for p,q in zip(heads,lists)]

您可以试试这个,修改 d 函数内的范围以调整到您想要的数字元素。

import random

def f(data):
    val = random.choice(data)
    ix = data.index(val)
    data.pop(ix)
    return val, data

def d(data):
    topholder = []
    m = len(data)/4
    for i in range(4):
        holder = []
        for n in range(m):
            holder.append(f(data)[0])
        topholder.append(holder)
    return topholder

d(data)

这将始终为您提供 4 个随机抽样值列表,不会重复。

另一个基于随机播放但确保所有子列表具有相同大小的情况,以防元素数量不能被列表数量整除(例如尝试 7)。

from random import shuffle

def split(data, n):   
    size=int(len(data)/n);
    for i in range(0, n*size, size):
        yield data[i:i+size]


data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54]
shuffle(data)
list(split(data, 5))

这是一个动态函数,它 returns 一个列表列表,其中每个列表都以指定值开头。嵌套列表的数量由starting_values.

的数量决定
import random

def get_random_list(element_list, starting_values, size_per_group):
    num_of_groups = len(starting_values)
    size_per_group -= 1
    total_elements = num_of_groups * size_per_group
    random_data = random.sample(element_list, total_elements)
    return [[starting_values[x]] + random_data[x * size_per_group:(x + 1) * size_per_group] for x in range(num_of_groups)]

data = [2, 3, 4, 7, 8, 12, 17, 24, 27, 33, 35, 36, 37, 38, 40, 43, 44, 50, 51, 54]

print(get_random_list(data, starting_values=[1, 2, 3, 4, 5, 6], size_per_group=2))
# OUTPUT: [[1, 36], [2, 54], [3, 17], [4, 7], [5, 35], [6, 33]]
print(get_random_list(data, starting_values=[9, 3, 5], size_per_group=6))
# OUTPUT: [[9, 54, 2, 7, 38, 24], [3, 35, 8, 37, 40, 17], [5, 44, 4, 27, 50, 3]]

它适用于 Python2.x 和 Python3.x 但对于 Python2.x 您应该将 range() 更改为 xrange() 以便更好地使用内存。