1

我需要删除列表的唯一元素,首先想到的是:

def cut_uniq(data):
    for x in data:
        if data.count(x) == 1:
            data.remove(x)
    print(data)

cut_uniq([1, 2, 3, 4, 5,])

返回

[2, 4]

请告诉我为什么?

4

2 回答 2

0

查看每次迭代:

  i   x     data
  0   1   [1,2,3,4,5]
  1   3   [2,3,4,5]
  2   5   [2,4,5] 
          [2,4]

您可以迭代与您正在修改的列表不同的列表。这将返回列表的副本

def cut_uniq(data):
    return [x for x in data if data.count(x) > 1]

或更有效地

from collection import Counter
def cut_uniq(data):
    return [x for x, count in Counter(data) if count > 1]

如果您确实想修改原始列表,而不是返回副本

def cut_uniq(data):
    i = 0
    while i < len(data):
        if data.count(data[i]) == 1:
            del data[i]
        else:
            i += 1

或者

from collections import Counter
def cut_uniq(data):
    for x, count in Counter(data):
        if count == 1:
            data.remove(x)

95% 的时间你在迭代时修改同一个列表,你会遇到问题。

于 2013-11-12T07:54:40.833 回答
0

当你使用

for x in data:

它转化为

对于 [0,1,2,3,4] 中的 i:x = data[i]

所以在第一个循环中,i = 0 data[i]=1。你从数据中删除 1,数据是 [2,3,4,5]

在第二个循环中,i = 1,因为现在数据是 [2,3,4,5],data[i] = 3。所以 2 留在数据列表中并且从未被访问过。

与数字 4 相同。

因此,当您完成循环时,列表​​中的 [2,4] 被允许。

于 2013-11-12T08:21:18.653 回答