Python random.shuffle(范围(10))报告类型错误
我想生成一个随机列表Python random.shuffle(范围(10))报告类型错误,python,python-3.x,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 it
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
我打算了解为什么它不起作用的机制?你能提供一些提示吗
random.shuffle
需要一个要洗牌的数字列表,而range(10)
不提供该列表。查看范围(10)
返回的内容:
num_arr = range(10)
num_arr
range(0, 10)
type(num_arr)
<class 'range'>
random.shuffle
需要一个要洗牌的数字列表,而range(10)
不提供该列表。查看范围(10)
返回的内容:
num_arr = range(10)
num_arr
range(0, 10)
type(num_arr)
<class 'range'>
random.shuffle
对给定的序列进行洗牌,就地,因此它不能是不可变的iterable
,例如范围
。您需要提供一个列表
修复代码的推荐方法是在范围
之外创建一个列表
,将其传递给列表
类型构造函数,即列表(范围(10))
另一种(不太常见)方法是使用列表理解:
num_arr = [n for n in range(10)]
random.shuffle(num_arr)
但是,请注意,
random.shuffle
将对给定序列进行洗牌,在适当的位置,因此它不能是不可变的可替换的
,例如范围
。您需要提供一个列表
修复代码的推荐方法是在范围
之外创建一个列表
,将其传递给列表
类型构造函数,即列表(范围(10))
另一种(不太常见)方法是使用列表理解:
num_arr = [n for n in range(10)]
random.shuffle(num_arr)
但是,请注意,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))
随机导入
def my_范围(数值:整数):
开始=0
当开始
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))
随机导入
def my_范围(数值:整数):
开始=0
当开始
看起来,shuffle函数使用类似于obj[0]
的项目分配来移动项目。如果使用random.sample()
,您可以执行任何操作。欢迎使用python 3shuffle(range())
在Python2.7=)中运行良好)您使用的是Python3吗?我在Python2.7上试过这个,没有问题list
,但我知道Python 3将range()
更改为与Python 2中的xrange()
相同,因此可能存在差异。@lenik:shuffle(range())
如果在调用中实际构造新的range
,那么它是毫无意义的random.sample(范围(n),n)
至少是有用的(因为它构造并返回一个全新的list
)。它看起来像是shuffle函数使用类似obj[0]
的项目赋值来移动项目。如果使用random.sample()
,您可以做任何想做的事情。欢迎使用python 3shuffle(range())
在Python2.7=)中运行良好)您使用的是Python3吗?我在Python2.7上试过这个,没有问题list
,但我知道Python 3将range()
更改为与Python 2中的xrange()
相同,因此可能存在差异。@lenik:shuffle(range())
如果在调用中实际构造新的range
,那么它是毫无意义的<代码>随机。示例(范围(n),n)至少有用(因为它构造并返回一个全新的列表
)。当普通列表(范围(10))
工作时,请不要建议使用无操作列表
理解(特别是在一个大的块中,它看起来像是“答案”)。它只是使初学者经常犯的错误永久化,即不必要地使用list
理解<代码>列表(范围(10))是正确的转换方式。@ShadowRanger Fair comment。我已经更新了我的答案。当普通的列表(范围(10))
有效时,请不要建议使用no op列表
理解(特别是在一个大的块中,它看起来像“答案”)。它只是使初学者经常犯的错误永久化,即不必要地使用list
理解<代码>列表(范围(10))是正确的转换方式。@ShadowRanger Fair comment。我已经更新了我的答案。