如何在至少一个if条件成立时执行统一逻辑?Python列表元素删除优化
简化重复条件判断的方案
你可以通过定义相反方向的配对集合,把多个if条件合并成一个判断,避免重复编写相同的删除逻辑。具体做法如下:
步骤1:定义相反方向的配对
先把所有需要匹配的相反方向对存起来,用frozenset(集合是无序的,能同时匹配两个元素的正反顺序):
opposite_pairs = {frozenset({"NORTH", "SOUTH"}), frozenset({"EAST", "WEST"})}
步骤2:合并条件判断
把原来的四个if语句合并成一个,只要当前的两个元素属于某一对相反方向,就执行删除逻辑:
arr = ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] length = len(arr) # 假设i、j是你已定义的相邻索引,比如j = i+1 i = 0 j = i + 1 current_pair = frozenset({arr[i], arr[j]}) if current_pair in opposite_pairs: # 先删索引大的元素,避免删前面的导致后面索引偏移 del arr[j] del arr[i] length -= 2
额外提示:修复索引偏移问题
你原来的代码存在潜在bug:如果先删除arr[i],arr[j]的索引会自动变成j-1,此时再删除arr[j]会删掉错误的元素。正确做法是先删索引较大的元素(j),再删索引较小的(i),避免索引偏移。
更直观的替代写法
如果对集合不太熟悉,也可以把所有正反顺序的配对列在一个元组里,直接判断:
opposite_pairs = (("NORTH", "SOUTH"), ("SOUTH", "NORTH"), ("EAST", "WEST"), ("WEST", "EAST")) if (arr[i], arr[j]) in opposite_pairs: del arr[j] del arr[i] length -= 2
这种写法更直白,效果和用frozenset完全一致。
内容的提问来源于stack exchange,提问作者juangalicia
相关产品推荐
相关产品推荐

