我必须在两个值之间循环,有时第一个值小于第二个值,有时第一个值大于第二个值(我正在处理网格内的两个单元格,第一个单元格可以打开第二个的左边,反之亦然)。
使用 Python,我可以指定 for 循环是否必须减少或增加它的值,但结果是这样的:
step = 1
if y < x:
step = -1
for n in range(x, y, step):
pass
是否有更多“pythonic”的东西来获得这个?
最佳答案
请注意,使用 step=-1
与从较小值到较大值的范围不相同!
>>> range(3, 7, 1)
[3, 4, 5, 6]
>>> range(7, 3, -1)
[7, 6, 5, 4]
第一个是从 3 到 6,后一个是从 4 到 7。
如果这仍然是您想要的,另一种方法是使用 or
:
>>> x, y = 7, 3
>>> range(x, y, x < y or -1)
[7, 6, 5, 4]
如果你想同时包括上下索引,你必须偏移to
索引:
>>> step = +1 if x < y else -1 # or use that 'or' expression
>>> range(x, y + step, step)
[7, 6, 5, 4, 3]
否则,您可以先对值进行排序,或者使用 min
和 max
或 sorted
:
>>> x, y = sorted((x, y))
>>> range(x, y)
[3, 4, 5, 6]
或者在一行中:range(*sorted((x, y)))
(虽然我觉得这可读性不是很好)
我做了一些时序分析,随机订购了 1000 个 x, y
对(每种方法都是相同的对):
-
x, y = sorted((x, y))
-> 1000 对约 305µs -
x, y = min(x, y), max(x, y)
-> 1000 对约 235µs -
x, y = (x, y) if x < y else (y, x)
-> 1000 对约 75µs
所以三元运算符是最快的,但在大多数情况下,与代码的其余部分(创建范围等)相比,它可能无关紧要
关于python - 如何使for循环增加或减少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32843354/