首页 > 解决方案 > 如何生成一个随机值列表,不包括另一个列表中的值

问题描述

我正在使用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] 

感谢您的帮助和时间。

无论如何,请注意并保持安全@家。

来自法国巴黎的问候:)

标签: python-3.x

解决方案


在评论之后,这是一个更简单的解决方案

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]

推荐阅读