Python列表推导式嵌套for循环报NameError: name 'lst'未定义
错误原因
你的报错是列表推导式嵌套循环的书写顺序错误导致的,和列表推导式本身的支持能力无关。
列表推导式的嵌套循环书写顺序和常规多层for循环的顺序完全一致,常规遍历嵌套列表的写法如下:
import re lsts = [['2020', '2019', '2018'], ['iPhone (1)', '$', '137781', '$', '142381', '$', '164888'], ['Mac (1)', '28622']] new_lst = [] # 外层循环先遍历大列表拿到每个子列表 for lst in lsts: # 内层循环再遍历子列表拿到每个元素 for ele in lst: new_lst.append(re.sub('[0-9]', '', ele))
你写的列表推导式把内外层循环顺序写反了,先执行for ele in lst的时候lst还没有被赋值,自然触发NameError: name 'lst' is not defined。
修复方案
方案1:输出扁平化一维列表
如果需要把所有处理后的元素整合到同一个一维列表中,调整循环顺序即可:
new_lst = [re.sub(r'[0-9]', '', ele) for lst in lsts for ele in lst]
小提示:正则匹配单个数字不需要加{1}(这是默认规则),加r前缀标记为原始字符串可以避免不必要的转义歧义
方案2:保留原嵌套结构
如果需要处理后和原列表保持完全一致的嵌套层级,使用双层嵌套列表推导式即可:
new_lsts = [[re.sub(r'[0-9]', '', ele) for ele in lst] for lst in lsts]
内容的提问来源于stack exchange,提问作者geds133
相关产品推荐
相关产品推荐

