```
在我要成為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** ->

```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/)