從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()
方法會返回 value
在 list
中出現的次數。所以,重複項的計數將大於 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)
。其中,keys
和 values
分別是包含字典的鍵和值的可迭代對象。
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列表中查找項目的索引。祝你學習愉快!