如何在Python中使用range()生成以下列表?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
如何在Python中使用range()生成以下列表?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
当前回答
你可以使用range(10)[::-1],它和range(9, -1, -1)是一样的,而且可以说可读性更强(如果你熟悉常见的序列[::-1]Python习语)。
其他回答
使用reversed()函数:
reversed(range(10))
这更有意义。
更新:
如果你想让它是一个列表(正如btk指出的那样):
list(reversed(range(10)))
更新:
如果您希望仅使用range来实现相同的结果,则可以使用它的所有参数。范围(开始,停止,步长)
例如,要生成一个列表[5,4,3,2,1,0],您可以使用以下命令:
range(5, -1, -1)
这可能不太直观,但正如评论所提到的,这是更有效的,并且是反转列表的正确使用范围。
假设你有一个列表,叫它 a = {1, 2, 3, 4, 5} 现在,如果你想反向打印列表,那么只需使用下面的代码。
a.reverse
for i in a:
print(i)
我知道你问使用范围,但它已经回答了。
[9-i for i in range(10)]
[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))而不会对性能造成任何影响。
对于那些对目前收集到的选项的“效率”感兴趣的人……
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版本在回答这个问题时是稳定的。