Python for循环过滤失效:遇到字典fence指定值时未终止添加操作
问题根因
你代码的核心错误出在边界判断的逻辑写法:
if number in ( fence["top_fence"] or fence["bottom_fence"] or fence["right_fence"] or fence["left_fence"] ):
Python中or是布尔逻辑运算符,括号内的表达式会先执行运算:只要fence["top_fence"]非空(此处显然非空),整个括号的返回结果就只有fence["top_fence"],剩下三个边界列表完全不会被纳入判断。也就是说你实际上只校验了当前值是否在顶部边界,碰到左、右、底部边界时判断都不会触发,break自然不会执行。
修正方案
方案1:直接修正判断逻辑
把判断条件改为分别校验每个边界列表:
if number in fence["top_fence"] or number in fence["bottom_fence"] or number in fence["right_fence"] or number in fence["left_fence"]:
也可以用any()函数简化写法:
if any(number in fence_line for fence_line in fence.values()):
方案2:优化查询效率(推荐)
提前把所有边界值合并为一个集合,集合的in查询时间复杂度为O(1),比多次遍历列表效率更高:
# 提前合并所有边界值为集合 all_fence = set(num for line in fence.values() for num in line) # 循环内判断改为 if number in all_fence:
额外注意点
你当前的代码逻辑是先把位置追加到合法列表,再判断是否为边界,因此边界值本身也会被存入possible_moves_within_fence。如果需求是边界不属于合法移动位置,需要把追加操作放到判断之后:
for number in possible_moves["tower"][key]: if number in all_fence: print(number) break possible_moves_within_fence[key].append(number)
完整修正代码示例
fence = { "right_fence": list(range(8, 65, 8)), "left_fence": list(range(1, 58, 8)), "top_fence": list(range(1, 9)), "bottom_fence": list(range(56, 65)), } # 提前合并边界集合 all_fence = set(num for line in fence.values() for num in line) # 棋子可移动的可能位置 possible_moves = { "tower": { "left-down": list(range(self.place_of_brick, 65, 7)), "left-up": list(range(self.place_of_brick, 1, -9)), "right-down": list(range(self.place_of_brick, 65, 9)), "right-up": list(range(self.place_of_brick, 1, -7)), } } possible_moves_within_fence = { "left-down": list(), "left-up": list(), "right-down": list(), "right-up": list(), } for key in possible_moves["tower"].keys(): for number in possible_moves["tower"][key]: # 若不需要把边界加入合法列表,调整下面两行的顺序即可 possible_moves_within_fence[key].append(number) if number in all_fence: print(number) break
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

