列表推导适用于从另一个列表中删除匹配项?



我想弄清楚当列表项(水果)与另一个列表(测试)中的项匹配时,删除列表项(水果)的最佳方法是什么。

fruits = ["apple", "banana", "cherry", "kiwi", "mango"]
test = ["nana", "erry"]
newList = ["apple", "banana", "cherry", "kiwi", "mango"]
for x in test:
for y in fruits:
if x in y:
newList.remove(y)
print(newList)

newList的输出与预期一致:['apple', 'kiwi', 'mango']

如果我尝试用列表推导来解决这个问题,这些项将被删除,但列表将在for循环后被打印两次。

fruitsNew = [y for x in test for y in fruits if x not in y]
print(fruitsNew)

fruitsNew输出是:["苹果"、"樱桃",猕猴桃,芒果,苹果,香蕉,猕猴桃,芒果的]

在第一次迭代中匹配"nana"被删除,并在第二次迭代中使用"erry"是删除。是否有一种方法可以在删除匹配项的同时打印列表一次?还是这个问题的列表理解不适用?

可以使用any

fruits = ["apple", "banana", "cherry", "kiwi", "mango"]
test = ["nana", "erry"]
newList = ["apple", "banana", "cherry", "kiwi", "mango"]
res = [i for i in fruits if not any(j in i for j in test)]
print(res)

输出
['apple', 'kiwi', 'mango']

您已经复制了源列表并从副本中删除了元素。这将是低效的。为什么不根据标准建立新的列表呢?这就是列表推导式的作用。

fruits = ["apple", "banana", "cherry", "kiwi", "mango"]
test = ["nana", "erry"]
newlist = [name for name in fruits if all(t not in name for t in test)]
assert newlist == ['apple', 'kiwi', 'mango']

换句话说,尽量避免有副作用的列表推导式。在这里,从另一个列表中删除元素是一种副作用。如果你真的需要,只需要使用for循环形式。

最新更新