236

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

some_list = range(1,1000)

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

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

4

9 回答 9

298

您可以从范围对象构造一个列表:

my_list = list(range(1, 1001))

这也是你在 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])并且也有效。

于 2012-07-14T00:48:39.323 回答
48

在 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]

虽然这等同于list(r),但它是文字语法,并且不涉及函数调用的事实确实让它执行得更快。如果您需要编写高尔夫代码,它的字符也会更少:-)

于 2017-11-02T23:53:12.330 回答
27

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

list(range(1000))

于 2015-02-28T18:38:07.523 回答
24

Python3 之所以缺少直接获取范围列表的功能,是因为最初的 Python3 设计者在 Python2 中相当新手。他只考虑range()在 for 循环中使用函数,因此,列表永远不需要扩展。事实上,我们经常需要使用range()函数来生成列表并传递给函数。

因此,在这种情况下,Python3 不如 Python2 方便,因为:

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

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

[*range(N)]
于 2018-07-24T12:26:41.767 回答
19

您真的不需要在列表中使用数字 1-1000。但是如果由于某种原因你真的需要这些数字,那么你可以这样做:

[i for i in range(1, 1001)]

简单的列表理解:

上面的列表理解转化为:

nums = []
for i in range(1, 1001):
    nums.append(i)

这只是列表理解语法,虽然来自 2.x。我知道这将在 python 3 中工作,但不确定是否也有升级的语法

范围开始包括第一个参数;但结束于,不包括第二个参数(当提供 2 个参数时;如果第一个参数不存在,它将从 '0' 开始)

range(start, end+1)
[start, start+1, .., end]
于 2012-07-14T00:47:28.170 回答
11

蟒蛇 3:

my_list = [*range(1001)]
于 2020-11-10T07:40:35.603 回答
4

实际上,如果您想要 1-1000(含),请使用range(...)带有参数 1 和 1001:的函数range(1, 1001),因为该range(start, end)函数从 start 到 (end-1),包括在内。

于 2012-07-14T00:49:24.843 回答
0

在 Python 3 中使用范围。

这是一个示例函数,它在两个数字之间的数字之间返回

def get_between_numbers(a, b):
    """
    This function will return in between numbers from two numbers.
    :param a:
    :param b:
    :return:
    """
    x = []
    if b < a:
        x.extend(range(b, a))
        x.append(a)
    else:
        x.extend(range(a, b))
        x.append(b)

    return x

结果

print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))

[5, 6, 7, 8, 9]  
[5, 6, 7, 8, 9]
于 2018-07-06T02:34:42.587 回答
-3

实际上,这是 Python3 相对于 Python2 的回溯。当然,使用 range() 和 xrange() 的 Python2 比分别使用 list(range()) 和 range() 的 Python3 更方便。原因是Python3的原设计者不是很有经验,他们只考虑了很多初学者使用range函数来迭代大量元素,内存和CPU效率都很低;但他们忽略了使用 range 函数生成数字列表。现在,他们想要改变已经为时已晚。

如果我要成为 Python3 的设计者,我会:

  1. 使用 irange 返回一个序列迭代器
  2. 使用 lrange 返回一个序列列表
  3. 使用 range 返回序列迭代器(如果元素数量很大,例如 range(9999999) 或序列列表(如果元素数量很小,例如 range(10))

那应该是最优的。

于 2018-02-10T09:44:53.263 回答