Python中如何无需循环基于多个通配符过滤列表
解决方法
首先纠正你代码里的小问题:变量名不能以数字开头,12 = [...]要改成l2 = [...]。
针对你的需求,这里有两种Pythonic的实现方式,都不需要手动写显式循环,且支持扩展多个过滤模式:
方法1:结合fnmatch与列表推导式
直接用你熟悉的fnmatch语法,把多个模式放到列表里,通过any()检查元素是否匹配任意一个模式:
import fnmatch l2 = ['peter_1', 'peter_2', 'peter_3', 'jerry', 'tim', 'johnson', 'steve_1', 'steve_2'] patterns = ['peter*', 'steve*'] # 后续加新条件直接往patterns里加就行,比如['peter*', 'steve*', 'tom*'] filtered = [item for item in l2 if any(fnmatch.fnmatch(item, pat) for pat in patterns)] print(filtered) # 输出: ['peter_1', 'peter_2', 'peter_3', 'steve_1', 'steve_2']
这种方式的优势是完全兼容fnmatch的通配符语法,学习成本低,扩展模式非常方便。
方法2:使用正则表达式(性能更优)
如果你的列表很大或者模式数量多,正则表达式的性能会更好。把所有前缀条件合并成一个正则规则,用re.compile()预编译后,结合filter()过滤:
import re l2 = ['peter_1', 'peter_2', 'peter_3', 'jerry', 'tim', 'johnson', 'steve_1', 'steve_2'] # 正则规则表示"以peter或steve开头",后续加新前缀直接在括号里加,比如^(peter|steve|tom) pattern_re = re.compile(r'^(peter|steve)') filtered = list(filter(pattern_re.match, l2)) print(filtered) # 输出: ['peter_1', 'peter_2', 'peter_3', 'steve_1', 'steve_2']
filter()会自动遍历列表并应用正则匹配,代码简洁高效。
需要说明的是:任何过滤操作都需要遍历列表一次(因为要逐个检查元素是否符合条件),但上面两种方法都避免了手动写for循环的冗余代码,属于标准的Pythonic写法。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

