python - Python3比较两个列表并找到通配符匹配
问题描述
list A: ['abc.txt', '123.txt', 'apple.jpg']
list B: ['ab', '123']
我想生成一个新列表 A,其中仅包含列表 B 中未包含通配符匹配的列表。想法输出将是:
list C: ['apple.jpg']
这是我的代码:
lista=['abc.txt', 'happy.txt', 'apple.jpg']
listb=['happy', 'ab']
listc=lista
for a in lista:
for b in listb:
print(a + ": " + b)
if b in a:
listc.remove(a)
print(listc)
我的代码的输出是:
abc.txt: happy
abc.txt: ab
apple.jpg: happy
apple.jpg: ab
['happy.txt', 'apple.jpg']
有谁知道哪里出错了?而且,有什么更好的方法吗?谢了。
解决方案
赋值后,listc=lista
两个变量都引用同一个列表。结果,您修改了您迭代的列表,这会导致不良的副作用。您应该复制原始列表:listc=lista.copy()
。
这是针对您的问题的更好的基于正则表达式的解决方案:
import re
pattern = re.compile('|'.join(listb)) # Anything ON the listb
# re.compile('happy|ab')
listc = [a for a in lista if not pattern.match(a)]
# ['apple.jpg']
推荐阅读
- for-loop - 使用 nunjucks 的“for”循环中的用户“elif”
- python - 从一个字典创建数据框并删除特定字符
- c++ - ifstream: /dev/stdin 与 std::cin 的工作方式不同
- powershell - 如何提取句点、星号和单词之间的字符串
- python - 如何使用网络抓取或 IMDbPY 来获取演员 Instagram 帐户的链接?
- java - 为什么签名指定接口时调用超类方法?
- json - 打印对象中不同条目的键和值
- google-chrome - 如何使用 Chrome DevTools 协议访问 XHR 请求?
- laravel - 普通 Web 和 API 中间件的 Laravel Echo 身份验证
- plot - 牛虻中的水平线