Python,从列表中删除重复项
我想python的方法是使用set,这是我刚学过的。在我学习set之前,我尝试了以下方法,但没有成功。有人能解释一下这是怎么回事吗?我得到了一个索引超出范围的错误,但我认为代码在编写时永远不会超过列表的索引范围。请解释发生了什么事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:
#!/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
作为列表的索引,为什么还要再次搜索它呢
它自己行上的下一个条目只是一个参考