Python,从列表中删除重复项

Python,从列表中删除重复项,python,list,Python,List,我想python的方法是使用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:

我想python的方法是使用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)

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

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

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

进一步的问题:您在代码中使用了一个未命名的
index()
函数,这意味着我们无法验证它的功能。如果它的工作方式类似于
list.index()
方法,那么您将从列表对象中删除第一次出现的值。这可能行得通,但您已经将
elem
作为列表的索引,为什么还要再次搜索它呢

它自己行上的
下一个
条目只是对的引用,从未调用过它。因此,它是不可操作的。您可能打算使用here

更简单的版本是:

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

e、 g.从列表末尾开始,如果当前元素出现在该位置之前的列表中,请将其删除。但是,使用集合的效率更高。

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

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

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

进一步的问题:您在代码中使用了一个未命名的
index()
函数,这意味着我们无法验证它的功能。如果它的工作方式类似于
list.index()
方法,那么您将从列表对象中删除第一次出现的值。这可能行得通,但您已经将
elem
作为列表的索引,为什么还要再次搜索它呢

它自己行上的
下一个
条目只是对的引用,从未调用过它。因此,它是不可操作的。您可能打算使用here

更简单的版本是:

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

e、 g.从列表末尾开始,如果当前元素出现在该位置之前的列表中,请将其删除。但是,使用集合的效率更高。

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

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

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

进一步的问题:您在代码中使用了一个未命名的
index()
函数,这意味着我们无法验证它的功能。如果它的工作方式类似于
list.index()
方法,那么您将从列表对象中删除第一次出现的值。这可能行得通,但您已经将
elem
作为列表的索引,为什么还要再次搜索它呢

它自己行上的
下一个
条目只是对的引用,从未调用过它。因此,它是不可操作的。您可能打算使用here

更简单的版本是:

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

e、 g.从列表末尾开始,如果当前元素出现在该位置之前的列表中,请将其删除。但是,使用集合的效率更高。

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

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

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

进一步的问题:您在代码中使用了一个未命名的
index()
函数,这意味着我们无法验证它的功能。如果它的工作方式类似于
list.index()
方法,那么您将从列表对象中删除第一次出现的值。这可能行得通,但您已经将
elem
作为列表的索引,为什么还要再次搜索它呢

它自己行上的
下一个
条目只是一个参考