1

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

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 的输出是:['apple', 'cherry', 'kiwi', 'mango', 'apple', 'banana', 'kiwi', 'mango']

在第一次迭代中,匹配“nana”的项目被删除,在第二次迭代中,匹配“erry”的单词被删除。有没有办法在删除匹配项目的同时只打印一次列表?或者这个问题的列表理解不适用?

问候

4

2 回答 2

1

你可以用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']
于 2021-08-19T06:09:02.280 回答
0

在这里,您复制了源列表并从副本中删除了元素。那将是低效的。为什么不根据标准建立新的名单呢?这就是列表推导的用途。

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 循环形式。

于 2021-08-19T06:30:16.857 回答