用于从List中删除重复项的功能

Function to remove duplicates from a List | Python

本问题已经有最佳答案,请猛点这里访问。

我试图编写一个函数remove_duplicates,只返回列表输入中的唯一值。我试图想出一些代码,但它抛出了无限循环错误。我不明白为什么。目标不是要达到结果,因为我发现有直接的方法可以做到这一点,比如"set"。但是,我主要是想理解我的错误,因为这是我的第一语言,也是任何编码的第一天。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def remove_duplicates(x):
    z = [x[0]]
    for i in range(1,len(x)):
        y = i-1
        k = 0
        while y >= 0:
            if x[i] == x[y]:
               k = k + 1
               y -= 1
        else:
            break
        if k == 0:
            z.append(x[i])
    return z


使用内置的python集功能。

1
y = list(set(x))

Y将是X的唯一元素列表。当X中的元素可以在一个集合中使用时,这就有效了,因此它们必须实现__eq__()__hash__()


如果你能用的话就好了

SET operator

要从列表中删除重复元素,请执行以下操作:

1
my_list = [1, 2, 3, 1, 1, 1, 1, 1, 2, 3, 4]

现在,从该列表中删除重复元素的时间:

1
2
3
list(set(my_list))

Answer: [1, 2, 3, 4]


您的代码的主要问题似乎在这里:

1
2
3
4
while y >= 0:
    if x[i] == x[y]:
       k = k + 1
       y -= 1

这里,只有当当前元素是匹配的时候,才会递减y,否则会进入一个无限循环。另外,您必须删除else: break,否则添加循环将在列表中第一个唯一元素(即第一个元素之后)之后立即停止。

如果你想忠于你最初的方法,你可以尝试一下:

1
2
3
4
5
6
7
8
9
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检查当前元素是否已经在结果列表中,而不是单独检查每个元素。

1
2
3
4
5
6
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更快。

1
2
3
4
5
6
7
8
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,但是:

1
2
3
import collections
def remove_duplicates(lst):
    return collections.OrderedDict(zip(lst, lst)).values()