从 Python 列表中删除重复项的 5 种方法

已发表: 2022-07-05

在本教程中,您将学习如何从 Python 列表中删除重复项

当您在 Python 中使用列表时,您有时可能需要仅使用列表中的唯一项——通过删除重复项。

有几种不同的方法可以做到这一点。 在本教程中,我们将介绍五种此类技术。

Python 列表基础

让我们通过回顾 Python 列表的基础知识开始我们的讨论。

Python 列表是可变的。 因此,您可以通过在列表中添加和删除元素来修改它们。 此外,Python 列表是元素的集合,不一定是唯一的。

那么如何只保留独特的元素删除重复或重复的元素呢?

好吧,你可以通过几种不同的方式来做到这一点。 您可以创建一个仅包含原始列表中唯一元素的新列表。 或者您可以选择就地修改原始列表并删除重复的项目。

我们将在本教程中详细了解这些内容。

从 Python 列表中删除重复项的方法

让我们举一个现实世界的例子。 假设你在朋友的生日聚会上。

在显示的糖果集合中,您会看到一些重复的项目。 您现在想从糖果列表中删除那些重复的项目。

从列表中删除重复项

让我们创建一个包含上图中所有项目的sweets列表。

 sweets = ["cupcake","candy","lollipop","cake","lollipop","cheesecake","candy","cupcake"]

在上面的sweets列表中,项目“糖果”和“纸杯蛋糕”重复了两次。 让我们使用这个示例列表来删除重复的项目。

迭代 Python 列表以删除重复项

最直接的方法是创建一个新列表,其中每个项目只包含一次。

通读下面的代码单元:

 unique_sweets = [] for sweet in sweets: if sweet not in unique_sweets: unique_sweets.append(sweet) print(unique_sweets) # Output ['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']
  • 我们初始化一个空列表unique_sweets
  • 在遍历sweets list时,我们访问每个sweet
  • 如果sweet尚未出现在unique_sweets列表中,我们使用.append()方法将其添加到unique_sweets列表的末尾。

假设您遇到一个重复的项目,例如, sweets列表中第二次出现“糖果”。 这不会添加到unique_sweets列表中,因为它已经存在:对于第二次出现“cupcake”和“candy” sweet not in unique_sweets计算结果为False

因此,在这种方法中,每个项目在unique_sweets列表中只出现一次——没有任何重复。

使用列表理解删除重复项

您还可以使用列表推导来填充unique_sweets列表。

想要刷新列表理解的基础知识?

️ 查看 Python 中的列表推导教程。

让我们使用列表推导表达式: [output for item in iterable if condition is True]来简洁地重写上面的循环。

 unique_sweets = [] [unique_sweets.append(sweet) for sweet in sweets if sweet not in unique_sweets] print(unique_sweets) # Output ['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

即使您正在创建一个新列表,您也不会使用值填充创建的列表。 这是因为输出是unique_sweets列表的.append()操作。

要从 Python 列表中删除重复项,您还可以使用内置列表方法,我们将在下一节中介绍这一点。

使用内置列表方法删除重复项

您可以使用 Python 列表方法.count().remove()删除重复项。

– 使用语法list.count(value) ,.count .count()方法返回valuelist出现的次数。 所以重复项对应的计数将大于 1。

list.remove(value)从列表中删除第一次出现的值。

使用上面的代码,我们有以下代码。

 for sweet in sweets: # check if the count of sweet is > 1 (repeating item) if sweets.count(sweet) > 1: # if True, remove the first occurrence of sweet sweets.remove(sweet) print(sweets) # Output ['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

由于.remove()方法删除第一次出现的值,因此您不能使用它删除出现两次以上的项目。

  • 如果特定项目重复(恰好出现两次),则此方法将删除第一次出现。
  • 如果一个特定的项目重复了K次,那么在运行上面的代码之后,仍然会保留K-1次重复。

但总的来说,当我们说重复时,我们通常指的是所有重复。

要处理这种情况,您可以修改上述循环以删除除一个之外的所有重复。 您可以运行一个while循环来重复删除重复项,直到列表中每个项目的计数为 1,而不是使用if条件来检查特定项目的计数。

sweets列表现在包含 2 个重复的“cupcake”和 3 个重复的“candy”。

 sweets = ["cupcake","candy","lollipop","cake","lollipop","candy","cheesecake","candy","cupcake"]

您可以使用while循环来删除重复,如下所示。 只要 sweets 中的 sweet 计数大于 1,while 循环就会继续运行。当只剩下一次时,条件 sweets.count(sweet) > 1 变为 False,循环跳到下一项。

 for sweet in sweets: # check if the count of sweet is > 1 (repeating item) while(sweets.count(sweet) > 1): # repeatedly remove the first occurrence of sweet until one occurrence remains. sweets.remove(sweet) print(sweets) # Output ['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

但是使用嵌套循环可能不是很有效,因此如果您正在处理大型列表,您可以考虑使用讨论过的其他技术之一。

到目前为止,我们已经了解了以下内容:

  • 从 Python 列表中删除重复项的方法——通过创建新列表——仅包含唯一项
  • 内置列表方法.count().remove()地修改列表

有一些 Python 内置数据结构要求值都是唯一的——不重复。 因此,我们可以将 Python 列表强制转换为这些数据结构之一以删除重复项。 然后将它们转换回列表。 我们将在接下来的部分中学习如何做到这一点。

将 Python 列表转换为一组以删除重复项

Python 集是所有唯一元素的集合。 因此,集合中存在的项目数(由len(<set-obj> ) 给出)等于存在的唯一元素数。

您可以使用以下语法将任何 Python 可迭代对象转换为集合: set(iterable)

现在,让我们将列表 sweets 转换为一个集合并检查输出。

 set(sweets) # Output {'cake', 'candy', 'cheesecake', 'cupcake', 'lollipop'}

从上述代码单元格的输出中,我们看到每个项目只出现一次,并且重复项已被删除。

另外,请注意,项目的顺序不一定与它们在原始列表糖果中的顺序相同。 这是因为,除了作为唯一元素的集合之外,Python 集合对象还是一个无序集合

现在我们已经通过将列表转换为集合来删除重复项,我们可以再次将其转换为列表,如下所示。

 unique_sweets = list(set(sweets)) print(unique_sweets) # Output ['cake', 'cheesecake', 'candy', 'cupcake', 'lollipop']

使用列表项作为字典键来删除重复项

Python 字典是键值对的集合,其中键唯一地标识值。

您可以使用.fromkeys()方法创建 Python 字典,语法如下: dict.fromkeys(keys, values) 。 这里, keysvalues是分别包含字典的键和值的可迭代对象。

  • keys必需参数,它可以是任何与字典键对应的 Python 可迭代对象。
  • values是一个可选参数。 如果您不指定可迭代的值,则使用默认值None

在不指定值的情况下, dict.fromkeys(sweets)返回一个 Python 字典,其中值设置为None - 默认值。 下面的代码单元解释了这一点。

 dict.fromkeys(sweets) # Output {'cake': None, 'candy': None, 'cheesecake': None, 'cupcake': None, 'lollipop': None}

和上一节一样,我们可以再次将字典转换为列表,如下所示。

 unique_sweets = list(dict.fromkeys(sweets)) print(unique_sweets) # Output ['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

从上面的输出中,我们可以看到重复项已从列表sweets中删除。

加起来

以下是可用于从 Python 列表中删除重复项或重复项的不同方法的概述。

  • 使用 Python 列表方法.append()将非重复项添加到新列表中。 新列表仅包含原始列表中的每个项目一次,并删除所有重复项。 您也可以使用列表推导来做到这一点。
  • 使用内置的.count().remove()方法删除恰好出现两次的项目。 可以将其放置在while循环中以删除所有其他事件。
  • 将 Python 列表转换为集合以仅保留唯一元素。
  • 使用dict.fromkeys(list)从列表中删除任何重复项,因为字典不应该有重复键。

接下来,查看 Python 项目以进行练习和学习。 或者学习如何在 Python 列表中查找项目的索引。 快乐学习!