当前位置: 首页 > 面试题库 >

在Python中从序列中删除项目的优雅方法?

黄景胜
2023-03-14
问题内容

当我用Python编写代码时,经常需要根据某些条件从列表或其他序列类型中删除项目。我还没有找到一种优雅而有效的解决方案,因为从当前正在迭代的列表中删除项目是很糟糕的。例如,您不能执行以下操作:

for name in names:
    if name[-5:] == 'Smith':
        names.remove(name)

我通常会做这样的事情:

toremove = []
for name in names:
    if name[-5:] == 'Smith':
        toremove.append(name)
for name in toremove:
    names.remove(name)
del toremove

这是低效的,相当丑陋,甚至可能有错误(它如何处理多个“ John Smith”条目?)。有没有人有一个更优雅的解决方案,或者至少是一个更有效的解决方案?

与字典配合使用的那一个怎么样?


问题答案:

完成过滤的两种简单方法是:

  1. 使用filter

names = filter(lambda name: name[-5:] != "Smith", names)

  1. 使用列表推导:

names = [name for name in names if name[-5:] != "Smith"]

请注意,这两种情况都保留谓词函数求值的值True,因此您必须颠倒逻辑(即,说“保留姓氏为史密斯的人”而不是“删除姓氏为史密斯的人”)史密斯”)。

编辑 好笑…两个人分别张贴了我在发布我的同时提出的两个答案。



 类似资料:
  • 问题内容: 在遍历列表时,我想根据条件删除列表中的项。请参见下面的代码。 这给了我一个例外。 如何才能做到这一点? 问题答案: 您需要使用和调用上,而不是使用循环。

  • 问题内容: 我正在创建一个待办事项应用程序,当我们单击它们时,我无法编写用于删除列表元素的代码。我希望用户单击时删除特定项目 问题答案: 您需要传递待办事项的索引,然后使用javascript中的slice函数将其删除

  • 问题内容: 如果想基于每个嵌套列表的第一个元素评估重复项,谁能提出一个好的解决方案从嵌套列表中删除重复项? 主列表如下所示: 如果已经在第一位置出现了另一个具有相同元素的列表,那么我想删除该列表并得到以下结果: 您可以建议一种算法来实现此目标吗? 问题答案: 您是否关心保留订单/删除了哪些重复项?如果不是,则: 会做的。如果您想保留订单并想保留第一个订单,则:

  • 问题内容: Python如何在迭代时从列表中删除项目? 问题答案: 你可以使用列表推导来创建一个仅包含你不想删除的元素的新列表: 或者,通过分配给,你可以将现有列表突变为仅包含所需的项目: 如果还有其他引用somelist需要反映更改,则此方法可能很有用。 除了理解之外,你还可以使用itertools。在Python 2中: 或在Python 3中:

  • 问题内容: 这是一个类似问题的后续问题,该问题询问最佳书写方式 似乎共识是关于 但是,我认为如果只删除一些项目,则大多数项目都将被复制到同一对象中,这可能很慢。在回答另一个相关问题时,有人建议: 但是,此处将搜索列表长度为O(N)的项目。可能我们的局限在于列表以数组而不是链接列表的形式表示,因此删除项目将需要在列表之后移动所有内容。但是,这里建议将collections.dequeue表示为双链表

  • 好的,所以这有点复杂,我有一个自定义的RecolyerView适配器,在OnBindViewWholder方法中,我希望根据一些不同的变量从RecolyerView中删除当前项,但当我从ArrayList中删除该项并调用得到:。 如何从OnBindViewWholder中的RecyclerView中删除该项?,我不想在设置适配器之前这样做,因为recyclerview中的每个项都有一个子列表,如果