Python中AND与NOT IN组合判断失效问题求助
修复递归与列表扩展中AND+NOT IN组合判断失效问题
问题描述
我在练习递归与列表扩展时遇到了判断逻辑失效的问题:代码中的if (a not in routeList) and (b not in routeList)始终返回True,导致重复的路线(比如['CDG'])被加入routeList。
输入输出示例
您当前位于LGA机场。
机场列表:
['BIG', 'CDG', 'GGG', 'DEL', 'DOH', 'DSM', 'EWR', 'EYW', 'HND', 'ICN', 'JFK', 'LGA', 'LHR', 'ORD', 'SAN', 'SFO', 'SIN', 'TLV', 'BUD']
- 您的目的地是?SIN
count: 0
a CDG
routeList [['CDG']]
count: 1
a FFF
routeList [['CDG'], ['FFF']]
count: 2
b CDG
routeList [['CDG'], ['FFF'], ['CDG']]
最后一个['CDG']属于重复添加,不符合预期。
问题原因
- 核心判断错误:
routeList是存储子列表的列表(比如[['CDG'], ['FFF']]),而a、b是字符串类型(比如'CDG')。用字符串判断是否在列表的列表中,永远返回False——因为列表里的元素是子列表,不是单个字符串。所以a not in routeList始终为True,导致整个组合条件永远成立。 - 添加时机错误:不管判断条件是否满足,代码都会执行
routeList.append(tempList[:]),这会导致空列表或重复内容被强制添加。
修复方案
- 调整判断逻辑:先构造出要添加的子列表(比如
['CDG']),再判断该子列表是否已存在于routeList中。 - 修正添加时机:仅当路线未重复时,才将子列表添加到
routeList。 - 简化路线提取:直接从航线中提取非起点的机场,构造目标子列表,避免冗余的临时列表操作。
修复后的代码
# 找出从LGA出发到指定机场的最短路径 # 起始机场固定为LGA # 机场列表 airports = ['BIG', 'CDG', 'GGG', 'DEL', 'DOH', 'DSM', 'EWR', 'EYW', 'HND', 'ICN', 'JFK', 'LGA', 'LHR', 'ORD', 'SAN', 'SFO', 'SIN', 'TLV', 'BUD'] # 航线列表 routes = [ ['BGI', 'LGA'], ['CDG', 'BUD'], ['CDG', 'SIN'], ['DEL', 'CDG'], ['DEL', 'DOH'], ['DSM', 'ORD'], ['EWR', 'HND'], ['EYW', 'LHR'], ['FFF', 'SIN'], ['HND', 'ICN'], ['HND', 'JFK'], ['ICN', 'JFK'], ['JFK', 'LGA'], ['LHR', 'SFO'], ['ORD', 'BGI'], ['SAN', 'EYW'], ['SFO', 'DSM'], ['SFO', 'SAN'], ['SIN', 'CDG'], ['TLV', 'DEL'], ] startingAirport = 'LGA' routeList = [] def checkRoute(startPt): global routes global routeList count1 = 0 for i in routes: if startPt in i: a, b = i # 提取非起点的机场,构造要添加的路线子列表 target = a if a != startPt else b new_route = [target] # 判断该路线是否未在routeList中存在 if new_route not in routeList: print('count: %d' % count1) print('a' if a != startPt else 'b', target) routeList.append(new_route) count1 += 1 print('routeList', routeList) def main(): print(len(routes)) print("您当前位于%s机场。\n" % startingAirport) print("机场列表:") print(airports) userIn = input("- 您的目的地是?") if userIn not in airports: print("\n该机场未在列表中,请重新输入") main() else: checkRoute(userIn) main()
修复说明
- 把判断逻辑从检查字符串是否在列表的列表中,改为检查构造好的子列表
new_route是否在routeList中,准确判断路线是否重复。 - 调整
routeList.append的位置,仅当路线未重复时才添加,避免无效内容进入列表。 - 移除了冗余的
tempList,直接构造目标子列表,逻辑更简洁清晰。
内容的提问来源于stack exchange,提问作者ExCode
相关产品推荐
相关产品推荐

