python for循环增加或减少

And*_*ono 7 python for-loop python-2.7 python-3.x

我必须在两个值之间循环,有时第一个值小于第二个值,有时第一个值大于第二个值(我正在处理网格中的两个单元格,第一个单元格可能位于网格的左侧)第二或反之亦然.

使用python我可以指定for循环是否必须减少或增加其值,但结果是这样的:

step = 1
if y<x:
    step = -1
for n in range(x,y,step):
    pass
Run Code Online (Sandbox Code Playgroud)

是否有更多的pythonic来获得这个?我正在使用python 2.7但是转移到python 3它不会是一个很大的问题.

tob*_*s_k 9

请注意,使用step=-1一样的,从较大的值小的范围内!

>>> range(3, 7, 1)
[3, 4, 5, 6]
>>> range(7, 3, -1)
[7, 6, 5, 4]
Run Code Online (Sandbox Code Playgroud)

第一个是3到6,后者是4到7.

如果那仍然是你想要的,另一种方式是使用or:

>>> x, y = 7, 3
>>> range(x, y, x < y or -1)
[7, 6, 5, 4]
Run Code Online (Sandbox Code Playgroud)

如果要包括下部索引和上部索引,则必须偏移to索引:

>>> step = +1 if x < y else -1 # or use that 'or' expression
>>> range(x, y + step, step)
[7, 6, 5, 4, 3]
Run Code Online (Sandbox Code Playgroud)

否则,您可以先使用minmax或排序值sorted:

>>> x, y = sorted((x, y))
>>> range(x, y)
[3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

或者在一行中:( range(*sorted((x, y)))虽然我认为这不是很可读)


我做了一些时序分析,订购了1000个随机x, y对(每种方法都有相同的对):

  • x, y = sorted((x, y)) - >~305μs,1000对
  • x, y = min(x, y), max(x, y) - > ~~235μs,1000对
  • x, y = (x, y) if x < y else (y, x) - >〜75μs,1000对

所以三元运算符是最快的,但在大多数情况下,与其余代码(创建范围等)相比,它可能并不重要.