Python 我想从一个列表中随机选择项目,并将其添加到另一个列表中,而无需替换
我试图从一个列表中随机选择项目,并将它们添加到另一个列表中 我从中选择的元素列表如下所示:Python 我想从一个列表中随机选择项目,并将其添加到另一个列表中,而无需替换,python,list,random,sample,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'
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个列表的列表,每个列表包含数据列表的随机样本,并且没有重复项。我还希望每个列表的第一个元素是我已经放入列表中的值。您可以使用
随机。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)
这是一个动态函数,返回一个列表列表,其中每个列表以指定的值开头。嵌套列表的数量由起始值的数量决定
它适用于Python2.x和Python3.x,但对于Python2.x,您应该将range()
更改为xrange()
更好地利用内存。首先对数据中的值进行随机化/洗牌,然后开始填充列表您正在对数据进行置乱并将其拆分。不知道如何在Python中执行此操作,但我确信有一个对拆分(示例(数据),rep(1:4,5))
我认为OP希望将值放入一个新列表中,因此列表=[data[I:I+4]对于范围(0,len(数据),4)]中的i,我将把值放入一个新列表中。我认为旧的列表可以被丢弃,但如果不是这样,他或她可以在洗牌之前复制数据。这很公平。我只是尝试匹配OPs命名,以得到与example@dashiell这是Python2.x还是Python3.x?这个代码在Python 3.x中不起作用,但是打印的方式表示Python 3.XI想要确保在编辑列表时,我可以将列表的第一个元素保持为预选值。
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))
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]]