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。
答案 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?