【順序保存】Python のリストや CSV から重複を削除するコード例

Python

Python(パイソン)の list(リスト)や CSV から、重複を削除するコード例です。

大きなリストを扱っていると、どこかで重複を削除する(排除する)必要が出てきました。

Python の重複処理では、集合 set() を使います

(Python) class set([iterable])

リストの要素が、集合にあればスキップ、無ければ追加で、重複を削除します(排除します)。

for 文で、順番に、新しいリストに追加していきます。

なので、当然、リストの順序も保存されます

集合を使って重複判定するアプローチは、シンプルで、とても高速でした。

決算分析システムでも、活躍しています。

リストから重複を削除するコード例(順序保存)

集合にあるか無いかで、重複判定をしています。

集合にあったら、重複なので、continue 文でスキップします。

(Python) break 文と continue 文とループの else 節

集合に無ければ、新しいリストに追加します。

そして、集合にも要素を追加します。

集合に要素を追加するときは、アッドメソッド .add() を使います

(Python) .add(elem)

ここでは、タイトル列[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) を使います。

(Python) タプル型 (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 ファイルを開きます。

(Python) open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

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

以上です。

スポンサーリンク
シェアする(押すとSNS投稿用の『編集ページ』に移動します)
フォローする(RSSフィードに移動します)
スポンサーリンク
シラベルノート
タイトルとURLをコピーしました