如何在一个语句中从列表中删除多个项?

在 python 中,我知道如何从列表中删除项:

item_list = ['item', 5, 'foo', 3.14, True]
item_list.remove('item')
item_list.remove(5)

上面的代码从 item_list中删除了值5和“ item”。 但当有很多东西需要删除时,我不得不写下许多行:

item_list.remove("something_to_remove")

如果我知道要删除的内容的索引,我会使用:

del item_list[x]

其中 x 是要删除的项的索引。

如果我知道要删除的所有数字的索引,我将使用某种循环来 del索引处的项。

但是,如果我不知道要删除的项的索引该怎么办?

我试过 item_list.remove('item', 'foo'),但是我得到一个错误说 remove只接受一个参数。

是否有办法在一个语句中从列表中删除多个项?

另外,我使用了 delremove。有人能解释一下这两者之间的区别吗? 还是它们是一样的?

282459 次浏览

在 Python 中,创建一个新对象(例如使用 列表内涵)通常比修改现有对象要好:

item_list = ['item', 5, 'foo', 3.14, True]
item_list = [e for e in item_list if e not in ('item', 5)]

相当于:

item_list = ['item', 5, 'foo', 3.14, True]
new_list = []
for e in item_list:
if e not in ('item', 5):
new_list.append(e)
item_list = new_list

对于过滤掉的大量值(在这里,('item', 5)是一小组元素) ,使用 set比使用 in操作 平均为 O (1)时间复杂度更快。首先构建要删除的迭代器也是一个好主意,这样你就不会在每次迭代列表内涵时都创建它:

unwanted = {'item', 5}
item_list = [e for e in item_list if e not in unwanted]

如果内存不便宜,开花过滤器开花过滤器也是一个很好的解决方案。

但是,如果我不知道要删除的项的索引该怎么办?

我不明白你为什么不喜欢。但是要获得对应于值使用的第一个索引。指数(值) :

ind=item_list.index('item')

然后删除相应的值:

del item_list[ind]

. index (value)获取 value 的第一个匹配项,. remove (value)删除 value 的第一个匹配项。

你可以通过将你的列表转换成 set并使用 set.difference在一行中完成:

item_list = ['item', 5, 'foo', 3.14, True]
list_to_remove = ['item', 5, 'foo']


final_list = list(set(item_list) - set(list_to_remove))

将给出以下输出:

final_list = [3.14, True]

注意 : 这将删除输入列表中的重复项,并且输出中的元素可以按任意顺序排列(因为 set不保持顺序)。它还要求两个列表中的所有元素都是 散列的

我从 给你转发我的答案,因为我看到它也适合在这里。 它允许删除多个值或仅删除这些值的副本 并返回一个新列表或在适当的位置修改给定列表。


def removed(items, original_list, only_duplicates=False, inplace=False):
"""By default removes given items from original_list and returns
a new list. Optionally only removes duplicates of `items` or modifies
given list in place.
"""
if not hasattr(items, '__iter__') or isinstance(items, str):
items = [items]


if only_duplicates:
result = []
for item in original_list:
if item not in items or item not in result:
result.append(item)
else:
result = [item for item in original_list if item not in items]


if inplace:
original_list[:] = result
else:
return result

Docstring 扩展:

"""
Examples:
---------


>>>li1 = [1, 2, 3, 4, 4, 5, 5]
>>>removed(4, li1)
[1, 2, 3, 5, 5]
>>>removed((4,5), li1)
[1, 2, 3]
>>>removed((4,5), li1, only_duplicates=True)
[1, 2, 3, 4, 5]


# remove all duplicates by passing original_list also to `items`.:
>>>removed(li1, li1, only_duplicates=True)
[1, 2, 3, 4, 5]


# inplace:
>>>removed((4,5), li1, only_duplicates=True, inplace=True)
>>>li1
[1, 2, 3, 4, 5]


>>>li2 =['abc', 'def', 'def', 'ghi', 'ghi']
>>>removed(('def', 'ghi'), li2, only_duplicates=True, inplace=True)
>>>li2
['abc', 'def', 'ghi']
"""

您应该清楚自己真正想要做什么,修改现有列表,或者使用 如果你有第二个引用指向的话,区分一下是很重要的 现有的名单。如果你有,例如..。

li1 = [1, 2, 3, 4, 4, 5, 5]
li2 = li1
# then rebind li1 to the new list without the value 4
li1 = removed(4, li1)
# you end up with two separate lists where li2 is still pointing to the
# original
li2
# [1, 2, 3, 4, 4, 5, 5]
li1
# [1, 2, 3, 5, 5]

这可能是你想要的行为,也可能不是。

我不知道为什么每个人都忘了提到 Python 中 set的惊人功能。您可以简单地将列表强制转换为一个集合,然后删除您想删除的任何内容,如下所示:

>>> item_list = ['item', 5, 'foo', 3.14, True]
>>> item_list = set(item_list) - {'item', 5}
>>> item_list
{True, 3.14, 'foo'}
>>> # you can cast it again in a list-from like so
>>> item_list = list(item_list)
>>> item_list
[True, 3.14, 'foo']

可以从 Itertools模块使用 滤镜错误函数

例子

import random
from itertools import filterfalse


random.seed(42)


data = [random.randrange(5) for _ in range(10)]
clean = [*filterfalse(lambda i: i == 0, data)]
print(f"Remove 0s\n{data=}\n{clean=}\n")




clean = [*filterfalse(lambda i: i in (0, 1), data)]
print(f"Remove 0s and 1s\n{data=}\n{clean=}")

产出:

Remove 0s
data=[0, 0, 2, 1, 1, 1, 0, 4, 0, 4]
clean=[2, 1, 1, 1, 4, 4]


Remove 0s and 1s
data=[0, 0, 2, 1, 1, 1, 0, 4, 0, 4]
clean=[2, 4, 4]

你可以用这个

假设我们有一个名单,l = [1,2,3,4,5]

我们希望在一个语句中删除最后两项

del l[3:]

我们有产出:

L = [1,2,3]

保持简单

假设我们有如下 我的名单。我们希望从列表中删除重复的0。通过使用 move () ,只能删除一个0,而下一个代码可以一次删除所有重复的0:

my_list = [1, 2, 3, 0, 0, 0, 3, 4]
list(filter(lambda a: a != 0, my_list))


output:


[1, 3, 3, 4]

我们可以移除多种元素

List1 = [1,2,3,4,5,200,30]

Del list1[1:3]

列印(表1)

[1,4,5,200,30]