如何判断循环列表中两个索引是否相邻?模运算能否替代特殊处理?
循环列表中判断两个索引是否相邻的优化方案
你的当前代码能处理普通相邻的索引,但没法覆盖循环列表首尾相邻的情况(比如索引5和0),不需要写特殊判断逻辑,用模运算就能优雅解决这个问题。
现有代码的问题
你当前的代码仅通过abs(a - b) == 1判断相邻,但循环列表里0和5的差值绝对值是5(假设列表长度为6),不符合该条件,会返回错误结果。
用模运算优化的代码
首先要明确循环列表的长度n(比如你例子里是6,索引范围0-5),修改函数如下:
def is_next_to(a, b, n): if a == b: return False # 模运算将差值转换到循环范围内,相邻的情况要么差1,要么差n-1(首尾相邻) return (a - b) % n in (1, n - 1)
或者另一种更直观的写法:
def is_next_to(a, b, n): if a == b: return False return abs((a - b) % n) == 1
验证断言
将列表长度设为6,所有断言都能通过:
assert is_next_to(1, 1, 6) is False assert is_next_to(1, 2, 6) is True assert is_next_to(0, 1, 6) is True assert is_next_to(5, 0, 6) is True assert is_next_to(4, 3, 6) is True assert is_next_to(3, 4, 6) is True
方案优势
这种方式不需要针对首尾写特殊逻辑,当循环列表长度变化时,只需要修改参数n的值即可,逻辑通用且简洁。
内容的提问来源于stack exchange,提问作者Robin Andrews
相关产品推荐
相关产品推荐

