Python列表子列表升序校验:修复索引越界问题
解决列表子列表升序检查的索引越界与逻辑问题
你要检查列表a=[[1,2],[3,4],[5,6]]里所有子列表是否按升序排列(每个子列表的对应元素都小于下一个子列表的对应元素),但原函数不仅出现了索引越界,还存在逻辑上的疏漏,我来一步步帮你修正。
原代码的问题分析
- 索引越界错误:外层循环
range(0, len(L))会让i遍历到len(L)-1,此时L[i+1]会访问超出列表范围的索引(列表最后一个元素的索引是len(L)-1,i+1等于len(L),这是不存在的位置)。 - 逻辑提前返回:原代码只要第一次进入循环就直接
return True或False,根本没检查完所有相邻的子列表对。比如第一个子列表满足条件,但第二个不满足时,函数会错误地返回True。 - 多余的内层循环:内层循环
j完全没起到作用,因为题目里每个子列表都是固定的两个元素,直接比较这两个元素即可,不需要遍历子列表的元素。
修改后的代码
def FirstRuleLink(L): # 遍历每一对相邻的子列表,循环到len(L)-1就停止,避免i+1越界 for i in range(len(L)-1): # 检查当前子列表的两个元素是否都小于下一个子列表的对应元素 if not (L[i][0] < L[i+1][0] and L[i][1] < L[i+1][1]): # 只要有一对不满足条件,直接返回False return False # 所有相邻子列表对都满足要求,返回True return True
代码解释
- 循环范围修正:
range(len(L)-1)确保i的取值是0到len(L)-2,这样i+1最大是len(L)-1,刚好是列表最后一个元素的索引,彻底避免了索引越界。 - 逻辑调整:改为只要有一对相邻子列表不满足条件就返回False,只有当所有相邻对都通过检查后,才返回True,完全符合你“所有子列表按升序排列”的要求。
- 简化代码结构:移除了没用的内层
j循环,直接比较子列表的两个元素,代码更简洁高效。
测试验证
用你的示例列表测试:
a = [[1,2],[3,4],[5,6]] print(FirstRuleLink(a)) # 输出True
再测试一个不满足的情况:
b = [[1,3],[2,4],[5,6]] print(FirstRuleLink(b)) # 输出False,因为第一个子列表的第二个元素3不小于下一个子列表的4
内容的提问来源于stack exchange,提问作者Ahmad Aziz
相关产品推荐
相关产品推荐

