代码的主要问题似乎是:while y >= 0:
if x[i] == x[y]:
k = k + 1
y -= 1
在这里,只有当当前元素是匹配的时,才减少y,否则将进入无限循环。另外,还必须删除else: break,否则add循环将在列表中的第一个唯一元素之后(即在第一个元素之后)立即停止
如果你想坚持你最初的方法,你可以试试:def remove_duplicates(x):
z = [x[0]]
for i in range(1,len(x)):
for y in range(0, i):
if x[i] == x[y]:
break
else:
z.append(x[i])
return z
但是,请注意,有很多简单的方法可以确保元素是唯一的。例如,您可以使用in检查当前元素是否已经在结果列表中,而不是单独检查每个元素。def remove_duplicates(lst):
res = []
for x in lst:
if x not in res:
res.append(x)
return res
如果元素保证是散列的,那么还可以使用set。但是不要做return list(set(lst)),因为这不会保留列表中元素的顺序。这比使用x not in res要快一些。def remove_duplicates(lst):
seen = set()
res = []
for x in lst:
if x not in seen:
res.append(x)
seen.add(x)
return res
如果您想要这样的一行代码,可以使用OrderedDict但是:import collections
def remove_duplicates(lst):
return collections.OrderedDict(zip(lst, lst)).values()