繁体   English   中英

Python3比较两个列表并查找通配符匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM