python-3.x - 如何生成一个随机值列表,不包括另一个列表中的值
问题描述
我正在使用Python 3.6.3。
我的代码生成一个包含五个值(整数类型)的随机列表。
将此随机列表中的值与另一个列表进行比较,该列表包含要从生成的列表中排除的值。这意味着,如果 exclude_numbers 列表中提到了随机数,则必须处理重绘以获得新值。
以下是简化的源代码:(您可以复制/粘贴,此代码正在运行)
import numpy as np
import random
excluded_values = [1,2,3,4,5,6,15,18,30] # values to exclude from the random list
print ("draw_numbers to exclude ",excluded_values,"\n")
loops = 1
for ln in range (0,loops):
# Random list
z=[]
z=random.sample(range(1,30), 5) # no duplicates
z.sort()
print ("Draw numbers original list z ", z,"\n")
# Standard deviation draw_numbers
deviation = np.std(z)
deviation=float(deviation)
deviation= round (deviation,5)
print ("draw_numbers loop number ",ln," ", z, " standard deviation ", deviation,"\n")
control_list = []
for i in range (0,5):
draw_number = z[i]
draw_number = str(draw_number)
print ("Draw number z[",i,"] ",draw_number)
print ("Original random list z ",z)
if int(draw_number) in excluded_values:
print ("Present in excluded_values")
# trigger if draw_number must be excluded
draw_number= random.randint(1,50)
print ("------>>> REDRAW draw_number ", draw_number)
draw_number = int (draw_number)
control_list.append(draw_number)
print ("Control list ", control_list," Original list z ",z,"\n")
else:
draw_number = int (draw_number)
control_list.append(draw_number)
print ("Control list ", control_list," z ",z,"\n")
continue
z = control_list
continue
但是问题仍然存在。
发生重绘时,必须对照 exclude_values 列表和 control_list检查新的抽奖编号,以使最终的 control_ 列表完全干净,没有重复。
在我的代码中尝试了很多方法后,我没有找到如何安排这个双重过程;我可能错过了一个论点或方法,我不知道如何管理这个“循环”过程。
下面是运行上述代码的示例:
draw_numbers to exclude [1, 2, 3, 4, 5, 6, 15, 18, 30]
Draw numbers original list z [4, 6, 9, 12, 18]
draw_numbers loop number 0 [4, 6, 9, 12, 18] standard deviation 4.91528
Draw number z[ 0 ] 4
Original random list z [4, 6, 9, 12, 18]
Present in excluded_values
------>>> REDRAW draw_number 45
Control list [45] Original list z [4, 6, 9, 12, 18]
Draw number z[ 1 ] 6
Original random list z [4, 6, 9, 12, 18]
Present in excluded_values
------>>> REDRAW draw_number 40
Control list [45, 40] Original list z [4, 6, 9, 12, 18]
Draw number z[ 2 ] 9
Original random list z [4, 6, 9, 12, 18]
Control list [45, 40, 9] z [4, 6, 9, 12, 18]
Draw number z[ 3 ] 12
Original random list z [4, 6, 9, 12, 18]
Control list [45, 40, 9, 12] z [4, 6, 9, 12, 18]
Draw number z[ 4 ] 18
Original random list z [4, 6, 9, 12, 18]
Present in excluded_values
------>>> REDRAW draw_number 14
Control list [45, 40, 9, 12, 14] Original list z [4, 6, 9, 12, 18]
感谢您的帮助和时间。
无论如何,请注意并保持安全@家。
来自法国巴黎的问候:)
解决方案
在评论之后,这是一个更简单的解决方案
from random import sample
k = 5
all_values = range(30)
excluded_values = [1,2,3,4,5,6,15,18,30]
k_sampled = sample(set(all_values) - set(excluded_values), k)
print(k_sampled) # --> [28, 10, 8, 11, 20]
推荐阅读
- postgresql - INSERT 上的 PSQL 触发器和函数对错误
- javascript - 如何从频道中检索旧消息?
- python - 如何使用 py2app 解决 pandas libs 间隔问题?
- c++ - 在多个模板上重复模板 enable_if 条件
- r - 具有变异和公式的嵌套模型
- c++ - 删除当前线程
- python - 将条目添加到字典列表
- sql - 仅当记录不存在时才将值插入表中。SQL Server 2012
- codenameone - MultipartRequest.calculateContentLength 错误
- javascript - 从动态对象数组中,如何将多个属性的值提取为数组