Python(パイソン)の list(リスト)や CSV から、重複を削除するコード例です。
大きなリストを扱っていると、どこかで重複を削除する(排除する)必要が出てきました。
Python の重複処理では、集合 set() を使います。
(Python) class set([iterable])
for 文で、順番に、新しいリストに追加していきます。
なので、当然、リストの順序も保存されます。
集合を使って重複判定するアプローチは、シンプルで、とても高速でした。
決算分析システムでも、活躍しています。
リストから重複を削除するコード例(順序保存)
集合にあるか無いかで、重複判定をしています。
集合にあったら、重複なので、continue 文でスキップします。
(Python) break 文と continue 文とループの else 節
集合に無ければ、新しいリストに追加します。
そして、集合にも要素を追加します。
集合に要素を追加するときは、アッドメソッド .add() を使います。
ここでは、タイトル列[1] を重複判定に使いました。
"""listの重複を確認しながら削除するコード例 (順序を保存します)"""
# 元データ
src_datas = [
['番号', 'タイトル'],
['0', '業績予想の修正'],
['1', '第72期 有報'],
['1', '第72期 有報'],
['2', '第73期 有報'],
['2', '第73期 有報'],
['3', '第73期 訂正有報'],
]
# 重複を排除するための集合
s = set()
# ユニークになったデータ(一意になったデータ)
datas = []
# 処理を開始する
for src_data in src_datas:
# もし、タイトル[1]が集合にあったらコンティニューする。
if src_data[1] in s:
continue
# リストに追加して、集合にタイトル[1]を追加する。
datas.append(src_data)
s.add(src_data[1])
# 使い終わった集合を削除
del s
print('元データ src_datas')
for t in src_datas:
print(t)
print('\nユニークになったデータ datas')
for t in datas:
print(t)
print('End')
実行結果
1番と2番の有報(ゆうほう)がダブっていましたが、重複を削除することができました。
元データ src_datas
['番号', 'タイトル']
['0', '業績予想の修正']
['1', '第72期 有報']
['1', '第72期 有報']
['2', '第73期 有報']
['2', '第73期 有報']
['3', '第73期 訂正有報']
ユニークになったデータ datas
['番号', 'タイトル']
['0', '業績予想の修正']
['1', '第72期 有報']
['2', '第73期 有報']
['3', '第73期 訂正有報']
End
複数の列を考慮するときはタプルを使います
重複判定をするときに、複数の列で判定したいときは、タプル (tuple) を使います。
タプルを作って、タプルが集合にあればスキップ、無ければ追加、というふうにします。
番号[0]とタイトル[1]の両方を考慮して、重複を削除するやり方です。
for 文の中で、以下のようにします。
# タプルを作る
key = (src_data[0], src_data[1])
# タプルが集合にあればスキップ(コンティニュー)
if key in s:
continue
# 集合に無ければ追加する
s.add(key)
要は、判定に使いたいものを取り出して、タプルに入れてしまえばよいのです。
なので、入れ子になったリストや辞書も、重複判定に使えます。
リストや辞書から値を取り出して、タプルに入れます。
このようにして、重複判定に使います。
リストを集合に変換するアプローチ
リストから重複を削除する方法として、リストを集合に変換するアプローチもあります。
リストを set() に渡して、集合に変換します。
最後に、集合をリストに再変換して、完成です。
ソーテッド関数 sorted() を使えば、リスト変換とソートが同時にできます。
(Python) sorted(iterable, /, *, key=None, reverse=False)
# 集合に変換して重複削除するアプローチ
datas = list(set(リスト))
datas = sorted(set(リスト), reverse=False)
それぞれ1行で書けましたので、とても便利でした。
リストを集合に変換するアプローチの使いどころです。
(1)リストが集合に変換できるタイプで、
(2)リストの順番が崩れても OK で、
(3)ほかの処理はしない、
というケースで役に立ちました。
『ちょっとユニークなアイテムの数を調べたい』
そういったときに、よく使っています。
CSV から重複を削除して読み込むコード例(順序保存)
重複を削除(排除)しながら、CSV ファイルを読み込むコード例です。
まず、csv モジュールをインポートします。
open() 関数で CSV ファイルを開きます。
for 文と csv.reader() で、1行ずつ読み込んでいきます。
(Python) csv.reader(csvfile, dialect='excel', **fmtparams)
そのときに、要素が集合にあればスキップ(コンティニュー)、無ければ追加で、重複を削除しています。
"""csvの重複を確認しながら削除するコード例 (順序を保存します)"""
import csv
# 元データ
src_file = r'*****\src_datas.csv'
# (src_datas.csv)
# 番号,タイトル
# 0,業績予想の修正
# 1,第72期 有報
# 1,第72期 有報
# 2,第73期 有報
# 2,第73期 有報
# 3,第73期 訂正有報
# 元データ (デバッグ用)
src_datas = []
# 重複を排除するための集合
s = set()
# ユニークになったデータ(一意になったデータ)
datas = []
# 処理を開始する
with open(src_file, 'r', encoding='utf-8') as f:
for src_data in csv.reader(f):
# 元データ (デバッグ用)
src_datas.append(src_data)
# もし、タイトル[1]が集合にあったらコンティニューする。
if src_data[1] in s:
continue
# リストに追加して、集合にタイトル[1]を追加する。
datas.append(src_data)
s.add(src_data[1])
# 使い終わった集合を削除
del s
print('元データ src_datas')
for t in src_datas:
print(t)
print('\nユニークになったデータ datas')
for t in datas:
print(t)
print('End')
実行結果
リストの場合と同じ結果になりました。
1番と2番の有報(ゆうほう)がダブっていましたが、重複を削除することができました。
順序も保存されています。
元データ src_datas
['番号', 'タイトル']
['0', '業績予想の修正']
['1', '第72期 有報']
['1', '第72期 有報']
['2', '第73期 有報']
['2', '第73期 有報']
['3', '第73期 訂正有報']
ユニークになったデータ datas
['番号', 'タイトル']
['0', '業績予想の修正']
['1', '第72期 有報']
['2', '第73期 有報']
['3', '第73期 訂正有報']
End
以上です。