random.shuffle(range(10))报告TypeError

时间:2018-08-20 23:46:12

标签: python python-3.x

我想生成一个随机列表,

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

我打算了解为什么它不起作用的原因?
您能提供任何提示吗?

3 个答案:

答案 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))