如何range()在Python中生成以下列表?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)
Mic*_*jer 513
使用reversed()功能:
reversed(range(10))
Run Code Online (Sandbox Code Playgroud)
它更有意义.
更新:
如果你想要它是一个列表(如btk指出):
list(reversed(range(10)))
Run Code Online (Sandbox Code Playgroud)
更新:
如果只想使用range相同的结果,可以使用其所有参数.range(start, stop, step)
例如,要生成列表[5,4,3,2,1,0],您可以使用以下内容:
range(5, -1, -1)
Run Code Online (Sandbox Code Playgroud)
它可能不太直观,但正如评论所提到的,这更有效,并且正确使用范围用于反向列表.
小智 307
使用'range'内置函数.签名是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]
Run Code Online (Sandbox Code Playgroud)
在Python 3中,这会产生一个非列表range对象,它有效地像只读列表一样工作(但使用的内存更少,特别是对于大范围).
mar*_*eau 42
您可以使用range(10)[::-1]哪个是相同的,range(9, -1, -1)并且可以说更具可读性(如果您熟悉常见的sequence[::-1]Python习惯用法).
Wol*_*olf 22
对于那些对目前收集的选项的"效率"感兴趣的人......
Jaime RGP的回答让我在按照我自己的建议(通过评论)按照Jason的某些"挑战性"解决方案计时后重启我的电脑.为了避免让你感到好奇的停机时间,我在这里介绍我的结果(最差的):
$ python -m timeit "[9-i for i in range(10)]"
1000000 loops, best of 3: 1.54 usec per loop
Run Code Online (Sandbox Code Playgroud)
martineau的答案(如果您熟悉扩展切片语法,则可读):
$ python -m timeit "range(10)[::-1]"
1000000 loops, best of 3: 0.743 usec per loop
Run Code Online (Sandbox Code Playgroud)
MichałŠrajer的答案(被接受的答案,非常易读):
$ python -m timeit "reversed(range(10))"
1000000 loops, best of 3: 0.538 usec per loop
Run Code Online (Sandbox Code Playgroud)
$ python -m timeit "range(9,-1,-1)"
1000000 loops, best of 3: 0.401 usec per loop
Run Code Online (Sandbox Code Playgroud)
使用Val Neekman的range(n-1,-1,-1)符号很容易记住最后一个选项.
小智 12
for i in range(8, 0, -1)
Run Code Online (Sandbox Code Playgroud)
会解决这个问题.它将输出8到1,-1表示反向列表
除了可读性之外,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
Run Code Online (Sandbox Code Playgroud)
如果有人想知道:)
没有意义使用reverse范围方法可以返回反向列表.
当您对n个项目进行迭代并希望替换返回的列表顺序时,range(start, stop, step)必须使用标识和设置的范围的第三个参数,其他参数应相应调整:step-1
-1(这是以前的价值stop - 1,stop等于0).n-1.因此,相反的范围(n)将以相反的顺序排列:
n = 10
print range(n-1,-1,-1)
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)
经常被问到的问题是是否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
Run Code Online (Sandbox Code Playgroud)
简而言之,Pythonreversed()仅适用于类似对象的数组,因此它应该具有与前向迭代相同的性能。
但是呢range()?不是发电机吗?在 Python 3 中,它是生成器,但包装在一个实现上述两个的类中。所以range(100000)不占用大量内存但它仍然支持高效的索引和反向。
因此,总而言之,您可以在reversed(range(10))不影响性能的情况下使用。
此问题中的要求要求list降序大小为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]
Run Code Online (Sandbox Code Playgroud)
您可以使用 range() BIF Like 打印反向数字,
for number in range ( 10 , 0 , -1 ) :
print ( number )
Run Code Online (Sandbox Code Playgroud)
输出将为 [10,9,8,7,6,5,4,3,2,1]
range() - 范围(开始、结束、增量/减量),其中开始是包含的,结束是不包括的,增量可以是任何数字,其行为类似于步骤
我相信这会有所帮助,
range(5)[::-1]
Run Code Online (Sandbox Code Playgroud)
下面是用法:
for i in range(5)[::-1]:
print i
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
388740 次 |
| 最近记录: |