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

时间:2018-05-29 19:34:31

标签: python

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

任何人都知道哪里出错了?而且,还有更好的方法吗? TKS。

4 个答案:

答案 0 :(得分:1)

在赋值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']

答案 1 :(得分:0)

您可以使用此列表推导来过滤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']

答案 2 :(得分:0)

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) 

答案 3 :(得分:0)

问题在于:

listc = lista

您正在复制引用,而不是内容:所以listc是lista。当你从lista中删除元素时,listc也会丢失这个元素。

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

import copy
listc = copy.copy(lista)

您可以在此处获取更多信息:How to clone or copy a list?