能否用列表推导式改写生成6个不重复1-45随机数的Python代码?
问题解答
首先,你尝试的那种单列表推导式写法无法实现需求,原因有两个:
- 列表推导式执行时,
result还未被定义,引用num not in result会直接抛出NameError; - 就算解决了变量引用问题,列表推导式的循环次数固定为6次,若生成重复数,无法跳过并重新生成新数,最终得到的列表长度可能不足6个元素。
可行的替代方案
1. 最简洁高效的实现(推荐)
Python的random模块自带sample()方法,专门用于从序列中随机选取指定数量的不重复元素,一行代码就能完成需求:
import random result = random.sample(range(1, 46), 6) print(result)
2. 结合生成器+列表推导式(满足练习需求)
如果一定要用列表推导式,可以先写一个生成器函数处理去重和重试逻辑,再用列表推导式遍历生成器收集结果:
import random def generate_unique_nums(count, start, end): seen = set() while len(seen) < count: num = random.randint(start, end) if num not in seen: seen.add(num) yield num # 用列表推导式收集生成器输出的结果 result = [num for num in generate_unique_nums(6, 1, 45)] print(result)
这种方式既用到了列表推导式,又通过生成器解决了动态去重和重试的问题,符合你的练习目的。
内容的提问来源于stack exchange,提问作者benu
相关产品推荐
相关产品推荐

