如何在Python数组中查找指定词并将结果存入全局变量?
嗨,我来帮你搞定这个问题!你遇到的核心问题是之前的代码逻辑没有正确处理“找到匹配后就停止”的需求,而且还有条件判断的语法错误,导致结果总是不符合预期。
先说说你之前代码的问题
第一个循环代码的问题
你最初的循环写法会每次遍历都覆盖borough的值:
global borough for item in subs: if item == "BX": borough = "BX" elif item == "QNS": borough = "QNS" else: borough = "something else" print borough
比如subs = ['BX', '4', 'train'],循环到第一个item时borough被设为BX,但循环到第二个item4时,因为不匹配BX/QNS,会执行else把borough改成something else,最后循环到第三个item还是会改成something else,所以最终结果永远是最后一次循环的赋值,而不是“只要存在匹配项就保留对应值”。
第二个列表推导式的问题
你的条件判断写错了!比如item=="BX" or "Bronx"这个逻辑等价于(item=="BX") or True,因为非空字符串在Python里是布尔真,所以这个条件永远成立,导致你的列表推导式会把所有item都包含进去,if条件永远为真?但你说总是得到最后一个选项,可能是你的测试用例里没有前面的匹配项,但核心是这个条件写法完全错误,正确的应该是item == "BX" or item == "Bronx"。
正确的解决方案
我们需要实现“只要数组里存在匹配的关键词,就给borough赋值对应的标识,并且找到后就停止检查”的逻辑,同时保证变量在全局作用域可用。
方案1:清晰的循环+匹配规则(推荐)
用字典来管理匹配规则,不仅清晰,以后加新的区域也方便:
# 全局作用域下不需要声明global,只有在函数内部修改全局变量时才需要 borough = "something else" # 设置默认值 # 定义匹配规则:键是要赋值的标识,值是对应的关键词集合 borough_rules = { "MANH": {"MANH", "Manhattan"}, "QNS": {"QNS", "Queens"}, "BX": {"BX", "Bronx"} } for item in subs: # 检查当前item是否在某个规则的关键词里 for code, keywords in borough_rules.items(): if item in keywords: borough = code break # 找到匹配就退出内层循环,不用再检查其他规则 else: continue # 内层循环没找到匹配,继续遍历下一个item break # 找到匹配就退出外层循环,不用再遍历剩下的item print(borough)
方案2:简洁的条件判断
如果规则不多,也可以用any()函数直接检查数组里是否存在匹配项,按优先级判断:
borough = "something else" # 按优先级检查,一旦前面的条件满足,就不会执行后面的判断 if any(item in {"MANH", "Manhattan"} for item in subs): borough = "MANH" elif any(item in {"QNS", "Queens"} for item in subs): borough = "QNS" elif any(item in {"BX", "Bronx"} for item in subs): borough = "BX" print(borough)
测试示例
用你给出的几个subs数组测试:
subs = ['BX', '4', 'train', 'mechanical', 'problems']→ 输出BXsubs = ['UPDATED:', 'MANH', '45', '6', 'trains', 'switch', 'trouble']→ 输出MANHsubs = ['Updated:', 'Queens', 'B62', 'bus', 'OEM', 'Drill']→ 输出QNSsubs = ['Huntington', 'Branch']→ 输出默认值something else
完全符合你的需求!
内容的提问来源于stack exchange,提问作者sprucegoose

