You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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']属于重复添加,不符合预期。

问题原因

  1. 核心判断错误:routeList是存储子列表的列表(比如[['CDG'], ['FFF']]),而a、b是字符串类型(比如'CDG')。用字符串判断是否在列表的列表中,永远返回False——因为列表里的元素是子列表,不是单个字符串。所以a not in routeList始终为True,导致整个组合条件永远成立。
  2. 添加时机错误:不管判断条件是否满足,代码都会执行routeList.append(tempList[:]),这会导致空列表或重复内容被强制添加。

修复方案

  1. 调整判断逻辑:先构造出要添加的子列表(比如['CDG']),再判断该子列表是否已存在于routeList中。
  2. 修正添加时机:仅当路线未重复时,才将子列表添加到routeList。
  3. 简化路线提取:直接从航线中提取非起点的机场,构造目标子列表,避免冗余的临时列表操作。

修复后的代码

# 找出从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:15:37