我目前正在处理数据结构列表,我想知道如何删除一个列表中出现在另一个列表中的所有元素。我看到了几个关于堆栈溢出的例子,其中谈到了从列表中删除单个元素,但不适用于删除多种类型相同元素的实例(如下面的例子,没有手动删除每个实例)。例如,给定以下两个列表:
friends_pets = ['Chicken', 'Chicken' 'Dog', 'Pigeon', 'Dog', 'Cat', 'Cat', 'Cat']
personal_pets = ['Dog', 'Cat']
我希望函数返回:
>>> ['Chicken', 'Chicken', 'Pigeon']
我认为使用filter()方法在remove()上返回所需的列表似乎是最理想的,但是,我很难访问Python存储在特定地址的信息。你知道吗
for pet in personal_pets:
filter(pet, friends_pets)
>>> <filter object at 0x10bfa2d90>
>>> <filter object at 0x10bfa2e50>
我甚至试过跑步:
for pet in personal_pets:
list(filter(pet, friends_pets))
但是,它声明“str”对象是不可调用的。你知道吗
使用remove()可以得到的最接近的结果是:
for pet in personal_pets:
friends_pets.remove(pet)
>>> ['Chicken', 'Chicken', 'Pigeon', 'Dog', 'Cat', 'Cat', 'Cat']
要使用
filter
,使用的函数是一个lambda,它过滤掉不需要的宠物。在这里,使用了listnew
,所以对friends_pets
列表没有破坏性。否则,可以使用该数组而不是new
。你知道吗然而,这种方法是浪费,因为它重建了新的阵列为每个宠物在个人宠物
可以更简单地使用列表理解来完成。你知道吗
如果列表很大,在这里使用一个集合可以加快速度
更新:必须在
friends_pets
中添加缺少的逗号friends_pets = ['Chicken', 'Chicken', 'Dog', 'Pigeon', 'Dog', 'Cat', 'Cat', 'Cat']
它在鸡和狗第二次出现之间就不见了。奇怪的是,它把它们当作一根弦,我不明白为什么。你知道吗
使用
set
将运行时间保持在O(n)范围内。你知道吗你可以做很多事情。你知道吗
如果输入可能很大,请使用生成器:
无发电机:
相关问题 更多 >
编程相关推荐