我想生成一个随机列表,
In [20]: num_arr = list(range(10))
In [22]: random.shuffle(num_arr)
In [23]: print(num_arr)
[8, 0, 7, 3, 9, 4, 1, 2, 6, 5]
但是,我尝试过
In [24]: num_arr = range(10)
In [25]: random.shuffle(num_arr)
TypeError: 'range' object does not support item assignment
我打算了解为什么它不起作用的原因?
您能提供任何提示吗?
答案 0 :(得分:1)
random.shuffle
需要一个数字列表以洗牌,range(10)
没有提供。看看range(10)
返回什么:
num_arr = range(10)
num_arr
range(0, 10)
type(num_arr)
<class 'range'>
range()
不返回数字列表,它返回类型为range
的对象。 range
对象是惰性迭代器(不是iterators
),在创建对象时不会生成其输出。您需要访问range
对象中的值,方法是使用for循环对其进行循环,或者使用list
list(num_arr)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
答案 1 :(得分:1)
random.shuffle
将给定的序列(就地)随机播放,因此它不能是不变的iterable
,例如range
。您需要提供一个list
。
修复代码的推荐方法是在list
中创建一个range
,方法是将其传递给list
类型的构造函数,即list(range(10))
。
num_arr = list(range(10))
random.shuffle(num_arr)
另一种(但不太常见)的方法是使用列表理解:
num_arr = [n for n in range(10)]
random.shuffle(num_arr)
但是请注意,using list constructor could be much faster than using list comprehension
答案 2 :(得分:1)
shuffle
函数需要传递一个列表,而range函数的作用更类似于生成器。为了了解这一点,我们将制作自己的my_range
函数来复制range函数,并尝试将其传递给shuffle,您将得到类似的错误。
import random
def my_range(num: int):
begin = 0
while begin < num:
yield begin
begin += 1
f = random.shuffle(my_range(10))