Python如何从any()迭代中获取匹配的x值?解决NameError问题
解决方案:获取匹配的前缀值并避免NameError
你的问题核心在于any()函数只是用来判断是否存在匹配项,它并不会保存那个匹配的x值——any()内部的x是该函数的局部变量,在外部根本访问不到,所以才会抛出NameError。
下面给你两种可行的解决方案:
方案1:用普通for循环遍历前缀(最直观)
把any()替换成直接遍历prefixes列表,这样就能在匹配时直接拿到对应的x:
keys = ['snmt1/metadata/table1/ref_table1_20190324124365.csv', 'snmt1/metadata/table2/table2_ref_20190324124365.csv', 'snmt1/metadata/table3/table3_20190324124365.csv'] def better_func(keys): for item in keys: split_key = item.split("/") filename = split_key[-1] # 不需要转str,split返回的就是字符串 prefixes = ['strm','ref','trunc'] match_found = False for x in prefixes: if x in filename: location = filename.find(x) if location == 0: print(f"匹配到前缀'{x}',索引为{location}") else: print(f"匹配到前缀'{x}',但不在开头,索引为{location}") match_found = True break # 找到第一个匹配的前缀就停止遍历 if not match_found: print("未匹配到任何前缀") better_func(keys)
运行这段代码的输出会是:
匹配到前缀'ref',索引为0 匹配到前缀'ref',但不在开头,索引为7 未匹配到任何前缀
方案2:用next()函数获取第一个匹配的前缀(更简洁)
如果只需要第一个匹配的前缀,可以用next()结合生成器表达式来快速拿到:
keys = ['snmt1/metadata/table1/ref_table1_20190324124365.csv', 'snmt1/metadata/table2/table2_ref_20190324124365.csv', 'snmt1/metadata/table3/table3_20190324124365.csv'] def better_func(keys): for item in keys: filename = item.split("/")[-1] prefixes = ['strm','ref','trunc'] # 用next获取第一个匹配的前缀,没有匹配就返回None matched_x = next((x for x in prefixes if x in filename), None) if matched_x: location = filename.find(matched_x) if location == 0: print(f"匹配到前缀'{matched_x}',索引为{location}") else: print(f"匹配到前缀'{matched_x}',但不在开头,索引为{location}") else: print("未匹配到任何前缀") better_func(keys)
这个方案和方案1的输出完全一致,但代码更紧凑,适合只需要第一个匹配项的场景。
为什么原代码会报错?
再明确一下:any(x in filename for x in prefixes)这个表达式里的x是生成器内部的变量,它的作用域仅限于这个生成器表达式内部,当你在any()外面写location = filename.find(x)时,Python找不到这个x,自然就会抛出NameError。
内容的提问来源于stack exchange,提问作者nojohnny101
相关产品推荐
相关产品推荐

