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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:17:31