我想从列表中随机选择项目并将其添加到另一个列表中而无需替换

时间:2016-08-02 19:48:39

标签: python list random sample

我试图从列表中随机选择项目并将其添加到另一个列表中。

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

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)

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

5 个答案:

答案 0 :(得分:2)

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)]

答案 1 :(得分:0)

您可以使用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]]

编辑:以上不会给你独特的价值;您应该接受上述答案的唯一值。我把问题解释错了!

答案 2 :(得分:0)

您可以尝试这样做,修改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个随机采样值列表,而不会重复。

答案 3 :(得分:0)

另一个基于shuffle但是确保所有子列表具有相同的大小,以防元素数量不能被列表的数量整除(例如,尝试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))

答案 4 :(得分:0)

这是一个动态函数,它返回列表列表,其中每个列表以指定值开头。嵌套列表的数量由 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()以更好地使用内存。