在LPTHW的ex32中,我发现我可以通过这样做来制作一个列表:
var1 = [list(range(6))]
或
var2 = range(6)
但是,当我使用'%d'在for-loop中打印var1时我得到一个typeError说它想要一个不是列表的数字。同时var2 将打印使用'%d'。我如何构造var1以要求特定的格式说明符?
答案 0 :(得分:2)
让我们重复一些案例:
range(6)
这会产生一个列表[0, 1, 2, 3, 4, 5]
list(range(6))
list()
需要一个可迭代对象,并将其转换为列表。因此list(range(6))
获取range(6)
返回的列表,并将其成员复制到新列表中。我们得到[0, 1, 2, 3, 4, 5]
。
[range(6)]
这使用python列表创建语法。这将把括号内的每个参数放在一个列表中。所以我们得到:[ [0, 1, 2, 3, 4, 5] ]
。请注意,这是一个列表列表。
[list(range(6))]
在这里,我们应该知道会发生什么。或多或少,range(6)
和list(range(6))
执行相同的操作,因此我们希望获得与上一行相同的结果,因此我们看到:[ [0, 1, 2, 3, 4, 5] ]
。
Python 3试图使内部函数返回更多惰性对象或迭代器。所以range(6)
没有在python 3.x中返回一个列表。相反,它返回一个自定义范围对象。可以通过执行list(range(6))
将此对象转换为列表,因为它可以迭代。但是,如果您不需要改变返回的对象,那么将它保留为范围对象可能是有意义的。
答案 1 :(得分:1)
var1
的错误在于你确实有2d list
。通过将整个事物放在方括号中,您实际上创建了一个带有单个元素的外部list
。这是导致错误的原因,因为一个元素也是list
。
>>> list(range(6))
[0, 1, 2, 3, 4, 5]
>>> [list(range(6))]
[[0, 1, 2, 3, 4, 5]]
只需摆脱封闭的方括号,使其正常工作。此外,正如您在Python 2中所做的那样,您不需要进行list
转换,只需这样做:
range(6)
这是你的第二选择。 :)
答案 2 :(得分:0)
var1 = [list(range(6))]
创建列表列表,而var2 = range(6)
创建列表。
>>> var1 = [list(range(6))]
>>> var1
[[0, 1, 2, 3, 4, 5]]
>>> var2 = range(6)
>>> list(var2)
[0, 1, 2, 3, 4, 5]
当你在方括号内的python中包含一个变量时,它返回一个列表,其中包含的变量作为列表的元素:
>>> var3 = 1
>>> var4 = [var3]
>>> isinstance(var4, list)
True
所以你需要做list(range(6))
。它返回一个列表。由于您通过[list(range(6))]
将其包含在方括号中,因此您将其列为列表。