【问题标题】:Deleting list elements whilst iterating over it [duplicate]迭代时删除列表元素[重复]
【发布时间】:2013-01-23 05:07:11
【问题描述】:

我需要在迭代列表时从列表中删除元素(我无法创建新列表,因为它在我无法控制的代码中被引用)。

我想到的最好的是:

last_index = len(somelist) - 1
for (index,item) in enumerate(reversed(somelist)):
    if somecondition(item):
        del somelist[last_index - index]

还有更好的选择吗?我也见过这个post 和这个one,但是所提供的解决方案都没有那么高效或简洁(恕我直言)。

【问题讨论】:

  • 您希望更简洁高效多少? Alex Martelli's answer 似乎两者兼而有之。与意见相关的问题不适合 Stack Overflow。
  • 您确定您的代码确实有效吗?初始化 somelistrange(100)somecondition(item)item % 2,我最终得到一个 IndexError。
  • @mgilson 我的第一个想法是应该是del somelist[-index](和enumerate(...,start=1))否则,我能想到的所有方法都已经在上一篇文章中介绍过
  • @isedev 我不确定效率,但你也可以做 somelist.remove(item) 而不是反转和枚举。
  • @JonClements -- 很遗憾这是一个骗子 -- 我最终可能会得到一个 great answer 徽章:O)

标签: python


【解决方案1】:

您可以使用列表理解+切片分配,这当然更简洁-我不知道效率(尽管我希望它在这方面也做得更好,因为您不需要不断变化每次删除项目时列表中的元素...)

somelist[:] = [ x for x in somelist if not somecondition(x) ]

【讨论】:

  • 快了大约 45%。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2016-12-03
  • 2010-11-09
  • 2016-11-21
  • 2011-07-13
  • 2016-07-19
  • 2011-04-02
相关资源
最近更新 更多