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

Python3比较两个列表并找到通配符匹配,python,Python,我想生成一个新的列表a,其中只包含不在列表B中的具有通配符匹配的列表。创意输出将是: list A: ['abc.txt', '123.txt', 'apple.jpg'] list B: ['ab', '123'] 这是我的密码: list C: ['apple.jpg'] 我的代码的输出是: lista=['abc.txt', 'happy.txt', 'apple.jpg'] listb=['happy', 'ab'] listc=lista for a in lista:

我想生成一个新的列表a,其中只包含不在列表B中的具有通配符匹配的列表。创意输出将是:

list A: ['abc.txt', '123.txt', 'apple.jpg']

list B: ['ab', '123']
这是我的密码:

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)
有人知道哪里出了问题吗?还有,还有更好的方法吗?Tks.

在赋值listc=lista之后,两个变量引用同一个列表。结果,您修改了迭代所通过的列表,这会导致不良的副作用。您应该复制原始列表:listc=lista.copy

以下是一个更好的、基于正则表达式的解决方案:

abc.txt: happy
abc.txt: ab
apple.jpg: happy
apple.jpg: ab
['happy.txt', 'apple.jpg']

您可以使用此列表来过滤B中不存在的元素,它们不在B的任何一个元素中,并且所有B的元素都不在其中:

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']

通过引用将python作为默认副本列表。您需要从lista到listc进行深度复制。复制库可以帮助您。按如下方式修改代码:

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']
问题在于:

    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。当您从lista中删除元素时,listc也将丢失此元素

如果要在listc中复制lista的内容,需要使用:

listc = lista

您可以在这里获得更多信息:

listc=lista没有任何作用,它只是给lista的数据起了另一个名字。。。什么原因?listc是与a完全相同的数据,如果修改一个,则修改另一个…通配符是什么意思?相同的前缀?bc也会排除abc.txt吗?您可能需要复制listc=ListListA之类的元素,这样您的问题就可以归结为:您不知道如何复制列表。幸运的是,这里有一个很好的问题和答案,这里不需要deepcopy。浅薄的副本。副本就足够了。
import copy
listc = copy.copy(lista)