【问题标题】:Remove duplicate values from a list从列表中删除重复值
【发布时间】:2012-05-19 16:32:17
【问题描述】:

代码优先:

li = [32,45,23,66,66,89,27]
print li
for k in li:
    if k == 66:
        li.remove(k)
print li

结果:

> [32, 45, 23, 66, 66, 89, 27] 

> [32, 45, 23, 66, 89, 27]

这是我的问题:当我删除第一个 66 时,第二个和其他项目将向前移动一个索引,下一个 k 将是 89。第二个66还在。如何删除它?

【问题讨论】:

  • 您不应该在遍历项目时删除它们,最好使用列表推导来创建具有正确值的新列表。

标签: python list


【解决方案1】:

我猜你想做的是this。所以在你的情况下:

li = [32,45,23,66,66,89,27]
print li
li[:] = [x for x in li if x != 66]
print li

当然,如果您想要使用普通的 for 循环来执行此操作,您可以随时迭代 li reversed:

li = [32,45,23,66,66,89,27]
print li
for k in reversed(li):
    if k == 66:
        li.remove(k)
print li

但请注意,这是非常低效的。因为remove 搜索第一次出现并删除它。因此,您可以有效地多次迭代列表。

【讨论】:

  • 我们不知道他需要维护相同的实际列表对象。他可能没有。
  • 没有理由改变旧列表。在这种情况下,重新绑定名称 li 实际上会稍微快一些(大约 10%)。更不用说它避免了不必要的代码复杂性。
【解决方案2】:

最常见的方法是遍历列表的副本,而不是原始列表:

for k in li[:]:
    #do stuff

我更喜欢使用列表推导:

[k for k in li if k != 66]

【讨论】:

  • 你的措辞对我来说不是很清楚,列表理解不会改变列表。
【解决方案3】:

查看我对Loop problem while iterating through a list and removing recurring elements 的回复,了解您遇到此问题的原因。

在这种情况下,您可以这样做:

li = [item for item in li if item != 66]

创建一个新列表。

如果你必须做很多removes,列表理解也会更快,因为每个remove必须遍历整个列表,而列表理解只遍历整个列表一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多