Python:简单列表修改任务

时间:2013-11-12 07:52:14

标签: list python-3.x

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

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]
请告诉我为什么?

2 个答案:

答案 0 :(得分: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%的时间你在迭代时修改同一个列表,你会遇到问题。

答案 1 :(得分: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]就会出现。