使用range()以相反的顺序打印列表?

ram*_*mit 333 python

如何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)

它可能不太直观,但正如评论所提到的,这更有效,并且正确使用范围用于反向列表.

  • 虽然它'效率低'.而你不能对它进行切片操作. (13认同)
  • 这个答案非常明确且易于理解,但它必须是`range(10)`,而不是`range(9)`.另外,如果你想要一个完整的列表(用于切片等),你应该做`list(reverse(range(10)))`. (6认同)
  • 使用python生成器的"反向"(假设我们讨论内置的Python 3范围)在概念上是错误的,并教导了在高级语言编程时不考虑内存/处理复杂性的错误习惯. (6认同)
  • 在Python3中,`reversed`一般不接受生成器,但它接受`range`.为什么`reverse(range(10000))`需要为整个列表分配内存?`range`可以返回一个实现`__reversed__`方法的对象,该方法允许有效的反向迭代? (4认同)
  • 这也会产生一个从8到0的列表,而不是9到0. (3认同)
  • 这会产生一个迭代器,OP要求以列表的形式提供结果. (3认同)
  • 这将导致为整个范围分配内存,这对于大范围或者如果您不需要所有值都是低效的.Python 2中的`range(9,-1,-1)`或`xrange(9,-1,-1)`将为您提供一个迭代器. (2认同)
  • @thedk `range` 不是生成器,使用 `reversed(range(...))` 是完全合理的事情 (2认同)

小智 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对象,它有效地像只读列表一样工作(但使用的内存更少,特别是对于大范围).

  • @ramesh如果在python shell中运行`help(range)`,它会告诉你参数.它们是要开始的数字,要结束的数字(独占)以及要采取的步骤,所以它从9开始并减去1直到它达到-1(此时它停止而不返回,这就是为什么范围结束于0) (8认同)
  • 真的,这是正确的答案,但可以更清楚地解释.`range(start,stop,step)` - 从数字`start`开始,并产生结果,除非已经达到`stop`,每次都按'step`移动. (5认同)
  • @ ramesh.mimit:去官方的Python网站.那里有完整的文档,包括一个很棒的教程. (3认同)

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)

bene的答案(第一个,但当时非常粗略):

$ python -m timeit "range(9,-1,-1)"
1000000 loops, best of 3: 0.401 usec per loop
Run Code Online (Sandbox Code Playgroud)

使用Val Neekmanrange(n-1,-1,-1)符号很容易记住最后一个选项.

  • 在阅读这个答案之前我做了自己的计时,并得到了相同的结果. (3认同)

小智 12

for i in range(8, 0, -1)
Run Code Online (Sandbox Code Playgroud)

会解决这个问题.它将输出8到1,-1表示反向列表

  • 这将给出“8, 7, ... 1”而不是“8, 7, ... 0”。在某种程度上,这是一个很好的答案,因为它显示了“range(..., -1)”技术有多么糟糕。 (2认同)

Jai*_*RGP 8

除了可读性之外,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)

如果有人想知道:)


And*_*yko 8

没有意义使用reverse范围方法可以返回反向列表.

当您对n个项目进行迭代并希望替换返回的列表顺序时,range(start, stop, step)必须使用标识和设置的范围的第三个参数,其他参数应相应调整:step-1

  1. 提供一站式参数为-1(这是以前的价值stop - 1,stop等于0).
  2. 作为启动参数使用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)

  • 坦率地说,我觉得这不像`reverse(range(n))`那么直观 (5认同)
  • @NicholasHamilton 同意你的观点,但是答案背后的想法是使用更少的资源......(问题是关于仅使用范围函数:)) (2认同)

Shi*_*hah 8

经常被问到的问题是是否range(9, -1, -1)reversed(range(10))Python 3更好?使用迭代器在其他语言中工作过的人立即倾向于认为 reversed() 必须缓存所有值,然后以相反的顺序返回。问题是,reversed()如果对象只是一个迭代器,那么 Python 的运算符就不起作用。该对象必须具有以下两个之一才能使 reversed() 工作:

  1. 支持len()和整数索引通过[]
  2. 或者有__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))不影响性能的情况下使用。


un3*_*33k 6

此问题中的要求要求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)

  • 我真的很喜欢**三合一`-1`**这正是*这种模式*可以很容易地保持*`围绕这个'包围'* - 今天我学会了如果它真的*必须高效*,当以相反的顺序遍历一个范围时,使用`range(n-1,-1,-1)`. (2认同)

Mr.*_*Jha 6

您可以使用 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() - 范围(开始、结束、增量/减量),其中开始是包含的,结束是不包括的,增量可以是任何数字,其行为类似于步骤


din*_*abu 5

我相信这会有所帮助,

range(5)[::-1]
Run Code Online (Sandbox Code Playgroud)

下面是用法:

for i in range(5)[::-1]:
    print i 
Run Code Online (Sandbox Code Playgroud)