如何在Python中使用range()生成以下列表?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
如何在Python中使用range()生成以下列表?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
当前回答
在python3中经常被问到的问题是range(9, -1, -1)是否比reverse (range(10))更好?在其他语言中使用迭代器的人立即倾向于认为reversed()必须缓存所有值,然后以相反的顺序返回。问题是,如果对象只是一个迭代器,Python的reversed()操作符就不起作用。对象必须具有以下两个中的一个才能使reversed()工作:
通过[]支持len()和整型索引 或者实现__reversed__()方法。
如果你尝试在一个以上都没有的对象上使用reversed(),那么你会得到:
>>> [reversed((x for x in range(10)))]
TypeError: 'generator' object is not reversible
所以简而言之,Python的reversed()只意味着对数组这样的对象,所以它应该具有与前向迭代相同的性能。
但是range()呢?那不是发电机吗?在python3中,它是生成器,但包装在实现上述两种方法的类中。因此range(100000)不会占用大量内存,但它仍然支持高效的索引和倒序。
因此,总的来说,您可以使用reversed(range(10))而不会对性能造成任何影响。
其他回答
这个问题中的需求需要一个降序为10的整数列表 秩序。那么,让我们用python生成一个列表。
# This meets the requirement.
# But it is a bit harder to wrap one's head around this. right?
>>> range(10-1, -1, -1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# let's find something that is a bit more self-explanatory. Sounds good?
# ----------------------------------------------------
# This returns a list in ascending order.
# Opposite of what the requirement called for.
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# This returns an iterator in descending order.
# Doesn't meet the requirement as it is not a list.
>>> reversed(range(10))
<listreverseiterator object at 0x10e14e090>
# This returns a list in descending order and meets the requirement
>>> list(reversed(range(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
除了可读性,反向(range(n))似乎比range(n)[::-1]更快。
$ python -m timeit "reversed(range(1000000000))"
1000000 loops, best of 3: 0.598 usec per loop
$ python -m timeit "range(1000000000)[::-1]"
1000000 loops, best of 3: 0.945 usec per loop
如果有人想知道的话:)
因为range(n)生成了一个可迭代对象,所以你可以做各种各样的事情来产生你想要的结果,比如:
range(n)[::-1]
如果循环没问题,我们可以创建一个队列:
a = []
for i in range(n):
a.insert(0,a)
return a
或者可以使用reverse()方法:
reverse(range(n))
使用'range'内置函数。签名是范围(start, stop, step)。这将产生一个产生数字的序列,从start开始,如果到达stop就结束,不包括stop。
>>> range(9,-1,-1)
range(9, -1, -1)
>>> list(range(9,-1,-1))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> list(range(-2, 6, 2))
[-2, 0, 2, 4]
列表构造函数将range(一个python生成器)转换为列表。
对于那些对目前收集到的选项的“效率”感兴趣的人……
Jaime RGP的回答让我重新启动了我的电脑,在计时之后,詹森按照我自己的建议(通过评论)进行了一些“具有挑战性”的解决方案。为了避免你的好奇心,我在这里列出了我的结果(最差的第一):[1]
Jason的回答(也许只是对列表理解能力的一次探索):
$ python -m timeit "[9-i for i in range(10)]"
1000000 loops, best of 3: 1.54 usec per loop
马蒂诺的回答(如果你熟悉扩展切片语法,可以读懂):
$ python -m timeit "range(10)[::-1]"
1000000 loops, best of 3: 0.743 usec per loop
michakovsky Šrajer的回答(公认的答案,非常有可读性):
$ python -m timeit "reversed(range(10))"
1000000 loops, best of 3: 0.538 usec per loop
Bene的回答(第一个,但在当时非常粗略):
$ python -m timeit "range(9,-1,-1)"
1000000 loops, best of 3: 0.401 usec per loop
最后一个选项很容易记住,使用Val Neekman的范围(n-1,-1,-1)表示法。
正如Karl Knechtel所评论的,这里给出的结果是依赖于版本的,并参考Python 3。X版本在回答这个问题时是稳定的。