我认为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)
答案 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。从列表末尾开始,如果当前元素出现在这个位置之前的列表中,则将其删除。但是,使用集合仍然会更有效率。