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

新手上路,请多包涵

在 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 只接受一个参数。

有没有办法在单个语句中从列表中删除多个项目?

PS 我用过 delremove 。有人可以解释这两者之间的区别,还是相同?

原文由 RandomCoder 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 335
2 个回答

在 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) 是一小部分元素),使用 setin 操作 更快 平均 O(1) 时间复杂度。首先构建要删除的可迭代对象也是一个好主意,这样您就不会在列表推导的每次迭代中都创建它:

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

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

原文由 aluriak 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以通过将列表转换为 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 不保留顺序)。它还要求两个列表中的所有元素都是可 散列的

原文由 Aakash Goel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题