Python,从列表中删除重复项

时间:2014-05-24 14:28:42

标签: python list

我认为Pythonic的方法是使用set,我刚才学到了。在我了解set之前,我尝试了以下不起作用的方法。有人可以解释这有什么问题吗?我有一个索引超出范围错误,但我认为代码永远不会超过列表的索引范围,因为它是写的。请解释发生了什么。

#!/usr/bin/python
# Remove dupes from a list
def Uniq_list(x):
  for elem in range(len(x)):
    if ( elem == 0 ):
      next
    else:
      if (x[elem] == x[(elem - 1)]):
        x.pop(index(x[elem])
  return x

mylist = ['1', '1', '2', '1', '3', '2']

print Uniq_list(mylist)

1 个答案:

答案 0 :(得分:3)

for循环只生成一次range()对象,但是在循环中,您要从列表中删除元素,使其更短。

这会导致另一个问题:您将跳过元素。如果删除元素1,则所有元素在向上移动一个位置后;元素2现在是元素1等。但是你的循环从不考虑这一点,所以它会跳过现在从位置2移动到1的元素。

事实上,您只使用前面的元素来测试集合成员资格;跳过的元素突然是正在测试另一个值的值。它们可能完全不同,但这并不意味着早期的元素不会相等。

其他问题:您在代码中使用了一个未命名的index()函数,这意味着我们无法验证它的功能。如果它与list.index()方法类似,则您将从列表对象中删除值的第一个。这可能有效,但您已经将elem作为列表的索引,为什么要再次搜索它?

它自己的行上的next条目只是对next() function的引用,而没有调用它。因此,这是一个无操作。你可能想在这里使用continue statement

更简单的版本应该是:

for i in range(len(x), -1, -1):
    if x[i] in x[:i]:
        del x

e.g。从列表末尾开始,如果当前元素出现在这个位置之前的列表中,则将其删除。但是,使用集合仍然会更有效率。