原文: Python Unique List – How to Get all the Unique Values in a List or Array

假设你有一个包含重复数字的列表:

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

但是你想要一个没有重复数字的列表:

unique_numbers = [1, 2, 3, 4]

有几种方法可以在 Python 中获取唯一值列表。本文将向你展示如何操作。

方法 1 – 使用集合获取唯一元素

使用 set 集合的方式去做。集合很有用,因为它包含独特的元素。

你可以使用集合来获取唯一元素。然后,将集合变成列表。

让我们看一下使用集合和列表的两种方法。第一种方法很冗长,但了解每一步发生的情况很有用。

numbers = [1, 2, 2, 3, 3, 4, 5]


def get_unique_numbers(numbers):

    list_of_unique_numbers = []

    unique_numbers = set(numbers)

    for number in unique_numbers:
        list_of_unique_numbers.append(number)

    return list_of_unique_numbers


print(get_unique_numbers(numbers))
# result: [1, 2, 3, 4, 5]

让我们仔细看看发生了什么。我得到了一个数字列表,numbers。我将此列表传递给函数 get_unique_numbers

在函数内部,我创建了一个空列表,最终将保存所有唯一数字。然后,我使用一个 setnumbers 列表中获取唯一数字。

unique_numbers = set(numbers)

我有了我需要的东西:唯一的数字。现在我需要将这些值放入一个列表中。为此,我使用 for 循环遍历集合中的每个数字。

for number in unique_numbers:
       list_of_unique_numbers.append(number)

在每次迭代中,我将当前数字添加到列表 list_of_unique_numbers 中。最后,我在程序结束时返回这个列表。

在 Python 中有一种更简单的方法来使用集合和列表来获取唯一值。这就是我们接下来要解决的问题。

使用 Set 的更短的方法

在 Python 的内置函数的帮助下,上面示例中编写的所有代码都可以被压缩为一行。

numbers = [1, 2, 2, 3, 3, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers)
# Result: [1, 2, 3, 4, 5]

虽然这段代码看起来和第一个例子很不一样,但想法是一样的。使用一个集合来获取唯一的数字。然后,将集合变成列表。

unique_numbers = list(set(numbers))

阅读上述代码时,“由内而外”地思考是有帮助的。首先评估最里面的代码:set(numbers)。然后,评估最外面的代码:list(set(numbers))

方法 2 – 使用迭代来识别唯一值

迭代是另一种可以考虑的方法。

主要思想是创建一个空列表用来存放唯一值。然后,使用 for 循环遍历给定列表中的每个数字。如果该数字已经是在唯一值的列表中,则继续进行下一次迭代。否则,将数字添加到列表中。

让我们看看两种使用迭代来获取列表中唯一值的方法,从更详细的一种开始。

numbers = [20, 20, 30, 30, 40]


def get_unique_numbers(numbers):
    unique = []

    for number in numbers:
        if number in unique:
            continue
        else:
            unique.append(number)
    return unique


print(get_unique_numbers(numbers))
# Result: [20, 30, 40]

这是每一步发生的事情。首先,我得到一个数字列表,numbers。我将此列表传递给我的函数 get_unique_numbers

在函数内部,我创建了一个空列表 unique。最终,此列表将包含所有唯一值。

我使用 for 循环遍历 numbers 列表中的每个数字。

 for number in numbers:
       if number in unique:
           continue
       else:
           unique.append(number)

循环内的条件检查当前迭代的数字是否在 unique 列表中。如果是,则循环继续到下一次迭代。否则,该数字将添加到此列表中。

这是重要的一点:只添加唯一的数字。循环完成后,我返回包含所有唯一数字的 unique 列表

一种更短的迭代方法

还有另一种方法可以用更少的行编写函数。

numbers = [20, 20, 30, 30, 40]


def get_unique_numbers(numbers):
    unique = []
    for number in numbers:
        if number not in unique:
            unique.append(number)
    return unique
#Result: [20, 30, 40]

区别在于条件。这次它被设置成这样:如果数字不在 unique 中,则添加它。

if number not in unique:
    unique.append(number)

否则,循环将移动到列表 numbers 中的下一个数字。

结果是一样的。然而,当布尔值被否定时,有时会更难思考和阅读代码。

还有其他方法可以在 Python 列表中查找唯一值。但是你可能会发现自己正在使用本文中介绍的方法之一。

我在 amymhaddad.com 上写了关于学习编程的文章。欢迎在 Twitter 上关注我:@amymhaddad