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

從Python列表中移除重複項的方法

在本指南中,你將學習多種從Python列表中移除重複項目的方法。

在Python中使用列表時,你可能需要僅保留列表中的獨特項目,也就是移除重複項。

有多種不同的方法可以實現這一點。本指南將介紹五種常用的技巧。

Python列表基礎知識

讓我們從複習Python列表的基礎知識開始。

Python列表是可變的。這意味著你可以通過添加或刪除元素來修改列表。此外,Python列表是元素的集合,不必是唯一的。

那麼,如何僅保留獨特元素並刪除重複項目呢?

你可以通過幾種不同的方法來達成這個目標。你可以創建一個僅包含原始列表中唯一項目的新列表。或者,你可以選擇直接修改原始列表並移除重複項目。

我們將在本指南中詳細探討這些方法。

從Python列表中移除重複項的方法

讓我們來看一個實際例子。假設你參加一個朋友的生日派對。🎊🎉

在展示的糖果集合中,你會看到一些重複的項目。你現在想從糖果列表中刪除這些重複項目。

讓我們創建一個包含上圖中所有項目的糖果列表。

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

在上面的糖果列表中,“candy”(糖果)和“cupcake”(杯子蛋糕)這兩個項目出現了兩次。讓我們使用這個示例列表來移除重複項目。

使用迴圈迭代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 列表時,我們檢查每個糖果。
  • 如果 sweet 尚未出現在 unique_sweets 列表中,我們使用 .append() 方法將其添加到 unique_sweets 列表的末尾。

當你遇到重複項目時,例如,sweets 列表中第二次出現的“candy”,它不會被添加到 unique_sweets 列表中,因為它已經存在:對於第二次出現的“cupcake”和“candy”, sweet not in unique_sweets 的計算結果為 False

因此,透過這種方法,每個項目在 unique_sweets 列表中僅出現一次,没有任何重复。

使用列表解析來移除重複項

你也可以使用列表解析(List Comprehension)來填充 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() 方法會返回 valuelist 中出現的次數。所以,重複項的計數將大於 1。

list.remove(value) 會從列表中移除第一次出現的 value

使用上面的程式碼,我們有如下程式碼:

for sweet in sweets:
  # 檢查 sweet 的計數是否 > 1(重複項目)
  if sweets.count(sweet) > 1:
  # 如果為 True,則移除第一次出現的 sweet
    sweets.remove(sweet)

print(sweets)

# Output
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

由於 .remove() 方法僅移除第一次出現的值,因此你不能用它來移除出現兩次以上的項目。

  • 如果特定項目重複(剛好出現兩次),此方法會移除第一次出現的項目。
  • 如果特定項目重複了 K 次,那麼在運行上述程式碼後,仍會保留 K-1 次重複。

但一般來說,當我們說重複時,我們通常指的是所有重複項目。

要解決這種情況,你可以修改上述迴圈,移除除一個之外的所有重複項。你可以使用 while 迴圈重複移除重複項,直到列表中每個項目的計數都為 1,而不是使用 if 條件來檢查特定項目的計數。

假設糖果列表現在包含 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:
  # 檢查 sweet 的計數是否 > 1(重複項目)
  while(sweets.count(sweet) > 1):
  # 重複移除第一次出現的 sweet,直到剩餘一個
    sweets.remove(sweet)

print(sweets)
# Output
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

但使用巢狀迴圈可能效率不高,因此如果你正在處理大型列表,可以考慮使用其他技術。

到目前為止,我們已經了解:

  • 從 Python 列表中移除重複項的方法——通過創建新列表——僅包含唯一項目
  • 內建列表方法 .count().remove() 可用於原地修改列表

有些Python內建的資料結構要求值都是唯一的,也就是不重複。因此,我們可以將Python列表強制轉換為這些資料結構之一來移除重複項。然後將它們轉換回列表。我們將在接下來的部分學習如何做到這一點。

將Python列表轉換為集合以移除重複項

Python 集合是所有唯一元素的集合。因此,集合中存在的項目數(由 len() 給出)等於存在的唯一元素數。

你可以使用以下語法將任何Python可迭代對象轉換為集合:set(iterable)

現在,讓我們將列表 sweets 轉換為一個集合並檢查輸出。

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

從上面程式碼單元的輸出中,我們可以看到每個項目只出現了一次,並且重複項目已被移除。

另請注意,項目的順序不一定與它們在原始列表 sweets 中的順序相同。這是因為,除了作為唯一元素的集合之外,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列表中查找項目的索引。祝你學習愉快!