從 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 列表中查找項目的索引。 快樂學習!