Try   HackMD
在我要成為Coding小天才系列文中,記錄了我在練習Python遇到的問題及解決方法。
如果這篇文章對你有幫助,或是願意給我鼓勵,歡迎幫我按下❤️(讚賞)ㄛ!

在寫code時可能會遇到python 串列(list) 處理的各種method應用,今天要提到的是

  1. 如何將串列list中的重複值去除
  2. 如何只拿出串列中的重複值

去除串列list重複值

其中 去除重複值通常可以使用幾種方法:

  • set(): 利用 集合 method去除重複,但執行過後的list不一定會是原順序
  • dict.fromkeys(): 利用 字典有序且唯一值的特性,去去掉重複值

那麼我們知道要怎麼去除list中的重複值後,如果想要篩選/拿出這些重複值又該怎麼做?
初學者如我,第一個想到的就是利用for迴圈去一一檢視是否重複,再用另一個list把他們接住。如此就可以收集到這些重複值了。以下是我試寫的範例:

可是這樣也太麻煩了吧 QAQ

怎麼樣才能只取出list中的重複值

於是我在survey過程中發現 Data Scientist維元 的文章:
Python 挑戰題:「只挑出重複出現的元素」參考解析

其中有寫到 拿出list中重複值的其他解法!一起來試試看吧!

方法二:利用 List 中的 count() 方法

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!

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 ->

參考資料

使用python優雅的一行解決list或DataFrame資料去重問題
從列表中挑選重複出現的元素臉書討論串from維元
Union() function in Python