如何range()
在Python中生成以下列表?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
如何range()
在Python中生成以下列表?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Answers:
使用reversed()
功能:
reversed(range(10))
这更有意义。
更新:
如果您希望将其作为列表(如btk所指出):
list(reversed(range(10)))
更新:
如果只想使用range
以达到相同的结果,则可以使用其所有参数。range(start, stop, step)
例如,要生成一个list [5,4,3,2,1,0]
,可以使用以下命令:
range(5, -1, -1)
它可能不那么直观,但是正如评论所提到的那样,这效率更高,并且正确使用范围用于反向列表。
range(10)
,不是range(9)
。另外,如果您想要一个完整的列表(用于切片等),则应该这样做list(reversed(range(10)))
。
reversed
通常不接受生成器,但接受range
。为什么reversed(range(10000))
需要为整个列表分配内存?range
可以返回实现实现__reversed__
有效反向迭代的方法的对象?
使用“范围”内置功能。签名是range(start, stop, step)
。这样会产生一个序列,该序列产生的数字以开头start
,如果stop
已经达到,则以结束,不包括stop
。
>>> range(9,-1,-1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(-2, 6, 2)
[-2, 0, 2, 4]
在Python 3中,这会产生一个非列表range
对象,该对象的作用类似于只读列表(但使用的内存较少,特别是大范围内存)。
help(range)
在python shell中运行,它将告诉您参数。它们是要开始的数字,要结束的数字(不包括)和要执行的步骤,因此它是从9开始并减去1,直到达到-1(这时它停止不返回,这就是为什么)范围在0处结束)
range(start, stop, step)
-从数字开始,start
直到每次都stop
移动为止,除非达到了产量结果step
。
对于那些对迄今收集到的选择的“效率”感兴趣的人...
Jaime RGP的回答使我在按照我自己的建议(通过评论)从字面上看Jason的 “具有挑战性”的解决方案计时后重新启动计算机。为了使您免于停机的好奇心,我在这里介绍我的结果(最差优先):
$ python -m timeit "[9-i for i in range(10)]"
1000000 loops, best of 3: 1.54 usec per loop
martineau的答案(如果您熟悉扩展切片语法,则可以阅读):
$ python -m timeit "range(10)[::-1]"
1000000 loops, best of 3: 0.743 usec per loop
MichałŠrajer的答案(公认的答案,非常可读):
$ python -m timeit "reversed(range(10))"
1000000 loops, best of 3: 0.538 usec per loop
$ python -m timeit "range(9,-1,-1)"
1000000 loops, best of 3: 0.401 usec per loop
使用Val Neekman的range(n-1,-1,-1)
记法很容易记住最后一个选项。
reverse
因为range方法可以返回反向列表。当您对n个项目进行迭代并且想要替换返回的列表的顺序时,range(start, stop, step)
必须使用range的第三个参数来标识step
并将其设置为-1
,其他参数应相应地进行调整:
-1
(这是以前的价值stop - 1
,stop
等于0
)。n-1
。因此,等效的range(n)相反:
n = 10
print range(n-1,-1,-1)
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
reversed(range(n))
除了可读性,reversed(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(1000000000-1,-1,-1)
呢?
此问题中的要求要求list
按降序排列大小为10的整数a 。因此,让我们在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]
-1
正是这种模式使它易于维护wrap one's head around this
-今天,我了解到,如果它确实必须高效,则可以range(n-1, -1, -1)
在以相反顺序遍历范围时使用。
您可以使用range()BIF Like来打印反向数字,
for number in range ( 10 , 0 , -1 ) :
print ( number )
输出将是[10,9,8,7,6,5,4,3,2,1]
range()-范围(start,end,increment / decrement),其中start是包含在内的,end是互斥的,而增量可以是任何数字,其行为类似于step
经常问到的问题是否range(9, -1, -1)
比reversed(range(10))
Python 3 更好?使用迭代器使用其他语言的人会立即想到,reversed()必须缓存所有值,然后以相反的顺序返回。问题是,reversed()
如果对象只是一个迭代器,Python的运算符将不起作用。该对象必须具有以下两项之一才能使reversed()起作用:
len()
和整数索引通过[]
__reversed__()
实施方法。如果您尝试对以上均不使用的对象使用reversed(),则会得到:
>>> [reversed((x for x in range(10)))]
TypeError: 'generator' object is not reversible
简而言之,Python reversed()
仅用于类似对象的数组,因此它应具有与正向迭代相同的性能。
但是呢range()
?那不是发电机吗?在Python 3中,它是生成器,但包装在同时实现以上两者的类中。因此,range(100000)
它不会占用大量内存,但仍支持高效的索引编制和反转。
因此,总而言之,您可以在reversed(range(10))
不影响性能的情况下使用它。
range(9,-1,-1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
reversed(range(10))
不那么容易出错。没有冒犯华诺士。只是一个诚实的观察。
不带[::-1]或反向使用-
def reverse(text):
result = []
for index in range(len(text)-1,-1,-1):
c = text[index]
result.append(c)
return ''.join(result)
print reverse("python!")
"python!"[::-1]
?
您不一定需要使用range函数,只需执行list [::-1]即可,它应该以相反的顺序快速返回列表,而无需使用任何添加。
假设您有一个名为a = {1,2,3,4,5}的列表,现在,如果您要反向打印该列表,则只需使用以下代码。
a.reverse
for i in a:
print(i)
我知道您问使用范围,但它已经回答。
我认为,许多人(作为我自己)可能对按反向顺序遍历现有列表的常见情况感兴趣,而不是如标题中所述,而不仅仅是为此类遍历生成索引。
即使对于这种情况,所有正确的答案仍然是完全正确的,但我想指出的是,在Wolf的答案中所做的性能比较仅用于生成索引。因此,我为反向遍历现有列表做了类似的基准测试。
TL; DR a[::-1]
是最快的。
先决条件:
a = list(range(10))
%timeit [a[9-i] for i in range(10)]
1.27 µs ± 61.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit a[::-1]
135 ns ± 4.07 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit list(reversed(a))
374 ns ± 9.87 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit [a[i] for i in range(9, -1, -1)]
1.09 µs ± 11.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
如您所见,在这种情况下,无需显式生成索引,因此最快的方法是减少额外操作的方法。
注意:我在JupyterLab中进行了测试,它具有方便的“魔术命令” %timeit
。它timeit.timeit
在引擎盖下使用标准。经过Python 3.7.3测试