Python 3将范围转换为列表

Boa*_*use 145 python list range python-3.x

我正在尝试制作一个包含数字的列表1-1000.显然,写入/读取会很烦人,所以我试图制作一个带有范围的列表.在Python 2中,似乎:

some_list = range(1,1000)
Run Code Online (Sandbox Code Playgroud)

会有用,但在Python 3中,范围类似于xrangePython 2?

任何人都可以对此提供一些见解吗?

mgi*_*son 184

您只需从范围对象构造一个列表:

my_list = list(range(1, 1001))
Run Code Online (Sandbox Code Playgroud)

这就是你在python2.x中使用生成器的方法.通常来说,你可能不需要列表,因为你可以my_list[i]更高效地获得值(i + 1),如果你只需要迭代它,你就可以重新开始range.

另请注意,在python2.x上,xrange仍然是可索引的1.这意味着range在python3.x上也具有相同的属性2

1print xrange(30)[12]适用于python2.x

2在python3.x中对1的类似语句是print(range(30)[12]),也可以.

  • 这绝对是要走的路,但是挑剔:这不是真正的"演员" (4认同)
  • 我会说“构造”或“构建”(或可能是“实现”)-因为您没有“将”生成器“转换”为列表,因此您正在从数据源创建新的列表对象成为一个发电机...(但是摆姿势只是分裂头发,而不是100%肯定我喜欢什么) (2认同)
  • 我的+1代表“构造”,因为它与其他OO语言一致。在其他语言中,`list(arg)`被理解为调用`list`类的构造函数。实际上,这也是Python的情况。争论对象是在构造期间填充(如在C ++情况下)还是仅在第一个自动调用的方法(例如Python的__init __()方法)中被填充不能改变基本的抽象概念。我的观点是*列表构造函数采用迭代器,并用返回的值填充列表*。 (2认同)
  • 为什么在jupyter笔记本电脑中出现错误并在shell中可以正常工作?错误:“'范围'对象不可调用” (2认同)

nur*_*qim 23

在Python 3.x中,range()函数有自己的类型.所以在这种情况下你必须使用迭代器

list(range(1000))

  • "在这种情况下你必须使用迭代器"?到底是什么意思? (8认同)
  • 我正在使用python 3.7和尝试过x = list(range(1000))但收到错误TypeError:'list'对象不可调用 (2认同)

Jim*_*ard 23

在Pythons <= 3.4中,你可以像其他人所建议的那样使用list(range(10))它来制作一个范围之外的列表(通常,任何可迭代的).

Python中引入的另一种替代方法3.5是解压缩一般化,它是*在列表文字中使用的[]:

>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

虽然这相当于list(r),它是文字语法,并且不涉及函数调用这一事实让它更快地执行.如果你需要编码高尔夫,这也是更少的角色:-)

  • 要清楚,你仍然可以单行:`[*range(10)]`当你不需要`range`用于任何目的但初始化`list`时效果很好.旁注:我最喜欢的(好的,不是真的)解包方法的一部分是空的`set`s现在有一个文字语法,`{*()}`,或者我称之为独眼猴操作符.;-) (3认同)
  • @ShadowRanger 这就是我最初编写它的想法。我决定更详细一些,以免让新的 Python 用户感到困惑:-) (2认同)

xua*_*g84 11

Python3缺少直接获取范围列表的函数的原因是因为原始的Python3设计器在Python2中非常新手.他只考虑在for循环中使用range()函数,因此,列表永远不需要扩展.实际上,我们经常需要使用range()函数来生成列表并传递给函数.

因此,在这种情况下,与Python2相比,Python3不太方便,因为:

  • 在Python2中,我们有xrange()和range();
  • 在Python3中,我们有range()和list(range())

尽管如此,您仍然可以通过以下方式使用列表扩展:

[*range(N)]
Run Code Online (Sandbox Code Playgroud)

  • 整个*点*是为了让制作`list`变得不那么方便,因为这通常是错误的做法。对于 100 个用例中的 99 个,制作一个实际的 `list` 是低效且毫无意义的,因为 `range` 本身在几乎所有方面都像一个不可变的序列,有时启动效率更高(例如,`int` 的包含测试是 ` O(1)`,与`列表`的`O(n)`)。在 Python 2 中,人们倾向于默认使用 `range`,尽管 `xrange` 几乎总是更好的选择;在 Python 3 中,您可以明确选择加入“列表”,而不是使用错误的名称而意外获得它。 (8认同)
  • 关于Python 3设计器及其在Python 2中的专业知识的评论是相当大胆和无礼的。 (4认同)
  • 会投票,特别是对于构建列表的解包简写,但我同意@kazarey。关于设计师的评论既没有根据(或者至少没有参考资料支持),也没有必要。 (2认同)

ins*_*get 9

您实际上不需要在列表中使用数字1-1000。但是,如果由于某些原因您确实需要这些数字,则可以执行以下操作:

[i for i in range(1, 1001)]
Run Code Online (Sandbox Code Playgroud)

清单理解概述:

上面的列表理解转换为:

nums = []
for i in range(1, 1001):
    nums.append(i)
Run Code Online (Sandbox Code Playgroud)

尽管只是2.x版本,但这只是列表理解语法。我知道这将在python 3中工作,但不确定是否还有升级的语法

范围从第一个参数开始;但以不包括第二个参数为结束(当提供2个参数时;如果第一个参数保留,则其将从'0'开始)

range(start, end+1)
[start, start+1, .., end]
Run Code Online (Sandbox Code Playgroud)

  • 为什么要理解?只是:`list(range(1000))` (16认同)
  • @ inspectorG4dget:list(range(1000))将在python3中工作,就像python2中的list(xrange(1000)) (4认同)

小智 6

蟒蛇3:

my_list = [*range(1001)]
Run Code Online (Sandbox Code Playgroud)