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它不会是一个很大的问题.
请注意,使用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)
否则,您可以先使用min和max或排序值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对所以三元运算符是最快的,但在大多数情况下,与其余代码(创建范围等)相比,它可能并不重要.
| 归档时间: |
|
| 查看次数: |
4823 次 |
| 最近记录: |