从列表中删除选择的元素

2024-04-26 12:06:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在处理数据结构列表,我想知道如何删除一个列表中出现在另一个列表中的所有元素。我看到了几个关于堆栈溢出的例子,其中谈到了从列表中删除单个元素,但不适用于删除多种类型相同元素的实例(如下面的例子,没有手动删除每个实例)。例如,给定以下两个列表:

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

Tags: in元素列表forfilterremovepersonal例子
2条回答

要使用filter,使用的函数是一个lambda,它过滤掉不需要的宠物。在这里,使用了listnew,所以对friends_pets列表没有破坏性。否则,可以使用该数组而不是new。你知道吗

然而,这种方法是浪费,因为它重建了新的阵列为每个宠物在个人宠物

>>> new = []
>>> new = [] + friends_pets
>>> for pet in personal_pets:
    new = list(filter(lambda x: x != pet, new))


>>> new
['Chicken', 'Chicken', 'Pigeon']

可以更简单地使用列表理解来完成。你知道吗

>>> L = [pet for pet in friends_pets if pet not in set(personal_pets)]
>>> L
['Chicken', 'Chicken', 'Pigeon']

如果列表很大,在这里使用一个集合可以加快速度

更新:必须在friends_pets中添加缺少的逗号

friends_pets = ['Chicken', 'Chicken', 'Dog', 'Pigeon', 'Dog', 'Cat', 'Cat', 'Cat']

它在鸡和狗第二次出现之间就不见了。奇怪的是,它把它们当作一根弦,我不明白为什么。你知道吗

使用set将运行时间保持在O(n)范围内。你知道吗

你可以做很多事情。你知道吗

如果输入可能很大,请使用生成器:

def exclude_items(original_list, items_to_exclude):
    # Create a set as lookup time is O(1).
    # It can be O(log N) in case of collisions though still better than O(n) without it
    to_exclude = set(items_to_exclude)
    for item in original_list:
        if item not in to_exclude:
           yield item

无发电机:

def exclude_items(original_list, items_to_exclude):
    to_exclude = set(items_to_exclude)
    return [item for item in original_list if item not in to_exclude]

相关问题 更多 >