Python 空列表的随机总体

Python 空列表的随机总体,python,Python,我必须用Python编写一个程序,其中我为2个空列表提供了一个范围和一些附加选项,因此该程序的方法应该如下所示: 给出可供选择的范围:10 给出选择的数量:5 我应该得到: 随机选择的数字列表:[2,3,7,1,8] 未选择的数字列表:[4,6,5,9,10] 数字不应重复,也不应出现在两个列表中 我有以下代码: import random selected_list=[] not_selected=[] selecting_number=int(input('give range to sel

我必须用Python编写一个程序,其中我为2个空列表提供了一个范围和一些附加选项,因此该程序的方法应该如下所示:

给出可供选择的范围:10

给出选择的数量:5

我应该得到:

随机选择的数字列表:[2,3,7,1,8]

未选择的数字列表:[4,6,5,9,10]

数字不应重复,也不应出现在两个列表中

我有以下代码:

import random
selected_list=[]
not_selected=[]
selecting_number=int(input('give range to select from : '))
select_num=int(input('give number of selections: '))
if selecting_number<select_num:
    print('error')
elif selecting_number>=select_num:
    for x in range(select_num):
        selected_list.append(random.randint(1,select_num))
    print(f'List of numbers selected randomly: {selected_list}')
    if not_selected not in selected_list:
        for y in range(select_num):
            not_selected.append(random.randint(1,select_num))
    print(f'List of numbers not selected previously: {not_selected}')

导致错误的原因是,
random
独立地拾取随机数,并且因为它们是随机的,所以有时会多次拾取相同的数

要解决此问题,可以使用
random.sample(要从中选择的列表,要选择的编号)
从文档中:

返回从填充序列中选择的唯一元素的列表 或设置。用于无需更换的随机抽样

一个实施方案是:

import random

range_to_pick_from = list(range(1,10))
selected = random.sample(x, 5)
not_selected = [a for a in range_to_pick_from if a not in selected]
print(selected,not_selected)
not_selected
也可以编写为传统的for循环:

not_selected = []
for num in range_to_pick_from:
    if num not in selected:
        not_selected.append(num)

您可以创建一个函数来经常复制它,并接受您的参数

import random

def make_random_lists(my_range=10, selections=5):
    """
    Generate two lists of random numbers.

    INPUT
    ------
      my_range - (int)  how large the range we are selecting from
      selections - (int)  how many numbers should be in the list select list

    OUTPUT
    ------

      s - (list) the selected numbers
      ns - (list) not selected numbers
    """
    # make sure input values are valid
    if (selections < my_range):
        return "selections must be less than range", None
    if my_range <= 0:
        return "range must be larger than 0", None

    total_numbers = set(range(1, my_range+1))  # make range
    s = random.sample(total_numbers, k=selections)  # get selections
    ns = total_numbers - set(s)  # find those not used

    return s, list(ns)
文档

如果您可以添加一个替代方案solutions@andryjohnson为什么?@andryjohnson导入是相同的,如果您愿意,可以将列表理解转换为for循环,您希望有什么不同?我还修复了一个变量名,现在试试看,伙计。。。你选择了那个种子来隐藏错误吗?:-)@HeapOverflow什么bug?
选项可以重复数字。但是你的种子会把它扫到地毯下面。那个地毯真的把房间连在一起了。@HeapOverflow,谢谢,改为,所以输出是一个唯一的填充值列表。你不应该使用assert来捕捉输入错误。见告诫1:
import random

def make_random_lists(my_range=10, selections=5):
    """
    Generate two lists of random numbers.

    INPUT
    ------
      my_range - (int)  how large the range we are selecting from
      selections - (int)  how many numbers should be in the list select list

    OUTPUT
    ------

      s - (list) the selected numbers
      ns - (list) not selected numbers
    """
    # make sure input values are valid
    if (selections < my_range):
        return "selections must be less than range", None
    if my_range <= 0:
        return "range must be larger than 0", None

    total_numbers = set(range(1, my_range+1))  # make range
    s = random.sample(total_numbers, k=selections)  # get selections
    ns = total_numbers - set(s)  # find those not used

    return s, list(ns)
selected, not_selc = make_random_lists(12, 4) 
print(selected) 
print(not_selc)

>>>[7, 5, 3, 4]
>>>[1, 2, 6, 8, 9, 10, 11, 12]