[英]Python3 compare two list and find wildcard match
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']
您可以使用此列表理解来过滤B中不存在的元素(它们不在B的任何元素中,并且所有B的元素都不在其中):
lista = ['abc.txt', '123.txt', 'apple.jpg']
listb = ['ab', '123']
listc = [a for a in lista if all(a not in b and b not in a for b in listb)]
print(listc) # => ['apple.jpg']
python作为参考的默认副本列表。 您需要从lista到listc进行深拷贝。 复制库可以为您提供帮助。 像这样修改您的代码:
import copy
lista=['abc.txt', 'happy.txt', 'apple.jpg']
listb=['happy', 'ab']
listc=copy.deepcopy(lista)
for a in lista:
for b in listb:
if b in a:
listc.remove(a)
print(listc)
问题在这里:
listc = lista
您正在复制参考,而不是内容:因此listc是lista。 从lista中删除元素时,listc也将丢失此元素。
如果要复制listc中lista的内容,则需要使用:
import copy
listc = copy.copy(lista)
您可以在此处获取更多信息: 如何克隆或复制列表?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.