``` 在我要成為Coding小天才系列文中,記錄了我在練習Python遇到的問題及解決方法。 如果這篇文章對你有幫助,或是願意給我鼓勵,歡迎幫我按下❤️(讚賞)ㄛ! ``` 在寫code時可能會遇到python **串列(list)** 處理的各種method應用,今天要提到的是 1. 如何將串列list中的重複值去除 2. 如何只拿出串列中的重複值 ### 去除串列list重複值 其中 ==去除重複值==通常可以使用幾種方法: * **set()**: 利用 **集合** method去除重複,但執行過後的list不一定會是原順序 * **dict.fromkeys()**: 利用 **字典**有序且唯一值的特性,去去掉重複值 那麼我們知道要怎麼去除list中的重複值後,如果想要**篩選/拿出這些重複值**又該怎麼做? 初學者如我,第一個想到的就是利用for迴圈去一一檢視是否重複,再用另一個list把他們接住。如此就可以收集到這些重複值了。以下是我試寫的範例: ```python= ``` 可是這樣也太麻煩了吧 QAQ ### 怎麼樣才能只取出list中的重複值 於是我在survey過程中發現 Data Scientist[維元](https://v123582.tw/about/) 的文章: [Python 挑戰題:「只挑出重複出現的元素」參考解析](https://blog.v12358.tw/2021/06/14/Python-挑戰題:「只挑出重複出現的元素」參考解析/) 其中有寫到 ==拿出list中重複值==的其他解法!一起來試試看吧! > 方法二:利用 List 中的 count() 方法... > ```python= > def f2(L): > L2 = [] > for e in set(L): > if L.count(e) > 1: > L2.append(e) > return L2 > L1 = [1, 3, 1, 2, 2, 4, 5, 3] > print(f2(L1)) # [1, 2, 3] > L2 = [1, 1, 1, 1, 1, 1, 1, 1] > print(f2(L2)) # [1] >``` ### 跟我一起練習:sunglasses: 假設今天list中有重複值,並且我想要獨立拿出這些重複值: 用自訂函數的方式,把list**先利用set() 執行後,再利用迴圈搭配count()** 的方式,一一去看原本的list中的元素,數起來是不是大於1。 --- ---也就是說先用set()去除重複值後,用精簡後的list元素一個一個拿出來當作索引值,再去原本的list**用count()數這個元素是不是曾經出現過超過一次**。如果是,就代表其已經重複。然後把這些出現次數超過1次的元素再收集起來,燈等✨✨ There you have the repeated items! ```python= def repeatcheck(list): return [i for i in set(list) if list.count(i)>1] ``` *以上有利用list comprehension練習讓code簡潔一點。 ### 延伸練習:兩個串列的重複值取出 假設我們今天要比對兩個list (list A & list B) 中是否有重複值,並且我想要獨立拿出這些重複值,該怎麼做呢? 你可能需要考慮原本的兩個list當中是不是原本就有重複值,將 **原先list的重複值要先處理掉**,以上述概念延伸過來,再利用set()集合運算的特性,找出重複值。 ### 複習set()運算 set()可以做**集合的運算**,例如:聯集union、交集intersection、差集difference等。 **聯集union** -> 兩個以上集合元素的總和(contains all the elements of both sets) (重複的部分會被扣掉一次) 寫法: ``` setA.union(setB) 或 setA | setB *三個就 setA.union(setB).union(setC) 或 setA.union(setB, setC) 或 setA |setB | setC ``` **交集intersection** -> 同時存在於多個集合當中的元素(contains all the elements that are common to both sets) 寫法: ``` setA.intersection(setB, setC, setD….) 或 setA & setB & setC *任意數量的集合都可以做~ ``` **差集difference** -> 集合與集合中不一樣的元素(the difference between two sets) 如寫A與B的差集,A在前即代表存在在A當中但不存在在B當中的元素 反過來,B在前方即代表存在在B當中但不存在在A當中的元素 寫法: ``` setA - setB 或 setA.difference(setB) ``` **對稱差集symmetric difference** -> ![](https://hackmd.io/_uploads/ByZdnTvc2.png) ```python= ``` ### 參考資料 -[使用python優雅的一行解決list或DataFrame資料去重問題](https://ithelp.ithome.com.tw/m/articles/10272122) -[從列表中挑選重複出現的元素臉書討論串from維元](https://www.facebook.com/dscareer/posts/129342919226294) -[Union() function in Python](https://www.geeksforgeeks.org/union-function-python/)