Python如何检查列表元素是否始终符合2-1-2序列模式
Python校验列表是否符合2-1-2交替规律的实现方法
你需要校验的2-1-2序列规律,本质是索引从0开始计数时,偶数位固定为2、奇数位固定为1的交替规则,有几种非常简单的实现方式,按需选用即可:
方法1:可定位所有异常位置的遍历校验(排查问题首选)
这个方法会把所有不符合规则的位置、实际值、预期值都列出来,排查异常的时候最实用:
L = [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1] def check_seq(lst): error_list = [] for index, value in enumerate(lst): expected_val = 2 if index % 2 == 0 else 1 if value != expected_val: error_list.append( (index, value, expected_val) ) return error_list errors = check_seq(L) if not errors: print("列表完全符合规则,无异常值") else: print(f"共检测到{len(errors)}个异常:") for pos, actual, expect in errors: print(f"索引{pos}处值为{actual},不符合预期值{expect}")
你提供的样例列表运行上述代码,会返回无异常的结果。
方法2:一行代码快速判断合规性
如果不需要定位具体异常位置,只想快速知道列表是否符合规则,用all()生成器表达式即可,写法极简、运行效率也高:
is_legal = all( (2 if i%2 == 0 else 1) == val for i, val in enumerate(L) )
返回True代表完全合规,返回False代表存在异常值。
拓展:适配任意重复序列的通用写法
如果后续你需要校验其他长度的重复规律(比如长度为3的2-1-3循环),可以用基准序列切片匹配的写法,不需要修改核心逻辑:
# 把基准重复序列写在这里即可,比如2-1循环就写[2,1],2-1-2循环就写[2,1,2] base = [2, 1] step = len(base) is_legal = all(L[i:i+step] == base for i in range(0, len(L), step))
内容的提问来源于stack exchange,提问作者LOR13
相关产品推荐
相关产品推荐

