python - 如何使for循环增加或减少?

标签 python for-loop

我必须在两个值之间循环,有时第一个值小于第二个值,有时第一个值大于第二个值(我正在处理网格内的两个单元格,第一个单元格可以打开第二个的左边,反之亦然)。

使用 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]

否则,您可以先对值进行排序,或者使用 minmaxsorted :

>>> 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/

相关文章:

python - 为什么 numpy.zeros 不在创建时分配所有内存?我怎么能强制它呢?

java - 奇怪的 : For loop returns last iteration under certain conditions

for 循环中的 C# 数组产生相同的随机整数值

python - DatetimeIndex 仅用于 pandas 中的每日数据

python - ctypes 如何知道何时抛出 ArgumentError,但只是有时?

python - 从 Python 执行 sqlite3 "dot"命令或在命令行实用程序中注册排序规则

windows - 如何安全地回显文字字符串 "%I"?

php - 循环遍历动态输入框并插入mysql数据库

c++ - 从带有for循环的函数返回时检查对象是否存在

python - 将当前日期添加到自定义小部件字段