こんにちは!beatbox4108です。
今日はPythonでリスト/タプルから重複要素を削除する方法について説明していきます。
方法は2種類あります。
- setを使う方法
- dictを使う方法
- dict+zip (応用)
setを使う場合
Pythonには重複しない値の集合であるset
があります。
ふつうはこれを使うのが良いでしょう。
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル
# setを使う場合
a=list(set(l))
print("setを使う場合:",a)
setを使う場合: [0, 1, 2, 3, 5, 6, 9]
アンパックを使えばもっと簡潔に書けます。
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル
# setを使う場合(別解)
b=[*{*l}]
print("setを使う場合 (別解):",b)
setを使う場合 (別解): [0, 1, 2, 3, 5, 6, 9]
この手法はリストの順番を考慮しません。自然にソートされます。
順番を考慮したい場合は次項のdict.fromkeys
を使ってください。
dict.fromkeysを使う場合
辞書のキーが重複しないことを利用した手法です。
順序を維持します。
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル
# dict.fromkeys を使う場合
c=list(dict.fromkeys(l))
print("dict.fromkeysを使う場合:",c)
dict.fromkeysを使う場合: [1, 2, 3, 5, 6, 9, 0]
こちらもアンパックを使えますが、あまり簡潔になった感じがしません...
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル
# dict.fromkeysを使う場合(別解)
d=[*dict.fromkeys(l)]
print("dict.fromkeysを使う場合(別解):",d)
dict.fromkeysを使う場合(別解): [1, 2, 3, 5, 6, 9, 0]
この手法でもバージョンによっては順番が維持されません。
OrderedDictを代わりに使用できます。
from collections import OrderedDict
dict+zip
さっきの応用で、dict関数にzip関数をかませて、上記と同様のことを行います。
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル
# dict+zipを使う場合
e=[*dict(zip(l,l))]
print("dict+zipを使う場合:",e)
dict+zipを使う場合: [1, 2, 3, 5, 6, 9, 0]
書く量は少ししか減らせなかったのに、可読性が落ちたような...
これ以上アンパックは使えません。無念。
いかがだったでしょうか?
これからも気が向いたらこんな小技を紹介していきたいと思っているのでよろしくお願いします!