【Python】リストから重複した要素を削除する方法

2023.01.06 /

【Python】リストから重複した要素を削除する方法

記事ではPythonにおける、リストから重複した要素削除する方法について詳しく解説していきます。

リストとは複数の値を順番に格納できるデータ型の一つです。リストについて詳しくは以下記事をご参照ください。

リストは重複した値を持つ要素も同じリストに持つことができます。このためプログラムによってはリストから重複した要素を削除する必要が出てきます。

ぜひ本記事を通して、リストから重複した要素を削除する方法について理解を深めてください。

リストから重複した要素を削除する方法

Pythonのデータ型の一つ「リスト」から重複した要素を削除するには以下に示す方法があります。

  • dict.fromkeys()
  • set型へ変換
  • set関数とsorted関数の組み合わせ
  • OrderedDict
  • Numpy
  • Pandas

もちろん上記の方法を使わなくても、for文やif文を利用してリストから重複した要素を削除することはできます。以下に一例を記します。

>>> list1 = [5, 4, 4, 5, 54, 1]
>>> list2 = []
>>> for num in list1:
...     if num not in list2:
...         list2.append(num)
>>> list2
[5, 4, 54, 1]

上記コードでも問題なく重複した要素を削除できていますが、コードが長くなり簡潔ではありません。本記事で紹介している方法であれば、より短いコードで簡潔にプログラムを組むことができます。

ちなみに上記のコードをリスト内包表記で表すと次のようになります。

>>> list1 = [5, 4, 4, 5, 54, 1]
>>> list2 = []
>>> [list2.append(num) for num in list1 if not num in list2]
>>> list2
[5, 4, 54, 1]

リスト内包表記について詳しくは以下記事をご参照ください。

簡単にリストから重複要素を削除する方法については次項より解説していきます。

dict.fromkeys()によるリストの重複要素の削除

dict.fromkeys()を使用したリストから重複要素を削除する流れは以下の通りです。

  1. dict.fromkeys()で重複を省いた辞書に変換
  2. list関数で辞書からリストへ変換

1.dict.fromkeys()で重複を省いた辞書に変換

dict.fromkeys()の引数にリストを指定すると、重複要素を削除した要素をキーとする辞書を取得できます。重複した要素が削除されるのは、辞書の特徴の一つ「重複したキーを持たない」を利用しているからです。

以下にdict.fromkeys()を使ったリストlist1から重複要素を削除した辞書を取得する例を記します。

>>> list1 = [5, 4, 4, 5, 54, 1]
>>> dict1 = dict.fromkeys(list1)
>>> dict1
{5: None, 4: None, 54: None, 1: None}

上記コードのようにリストの要素をキー、値がNoneの辞書が取得できます。

2.list関数で辞書からリストへ変換

dict.fromkeys()で得られた辞書をlist関数に指定することで、辞書のキーを要素とするリストを取得できます。

>>> list2 = list(dict1)
>>> list2
[5, 4, 54, 1]

このようにdict.fromkeys()とlist関数を組み合わせることでリストから重複要素を削除できます。

重要な点としてdict.fromkeys()の場合、元のリストの順序を保ったまま重複要素を削除できます。

set型へ変換することによるリストの重複要素の削除

set型へ変換することによるリストから重複要素を削除する流れは以下の通りです。

  1. set関数でリストからセットへ変換
  2. list関数でセットからリストへ変換

1.set関数でリストからセットへ変換

set関数にリストを指定すると、重複要素を削除したsetのオブジェクトを取得できます。重複した要素が削除されるのは、setの特徴の一つ「ユニークな要素の集合」を利用しているからです。setについて詳しくは以下記事をご参照ください。

以下にset関数を使ったリストlist1から重複要素を削除したsetを取得する例を記します。

>>> list1 = [5, 4, 4, 5, 54, 1]
>>> set1 = set(list1)
>>> set1
{1, 4, 5, 54}

2.list関数でセットからリストへ変換

set関数で得られたsetオブジェクトをlist関数に指定することで、setオブジェクトの要素を要素とするリストを取得できます。

>>> list2 = list(set1)
>>> list2
[1, 4, 5, 54]

このようにset関数とlist関数を組み合わせることでリストから重複要素を削除できます。

重要な点としてset型へ変換の場合、元のリストの順序を保っていないことに注意してください。

set関数とsorted関数の組み合わせによるリストの重複要素の削除

set関数とsorted関数を組み合わせることによってリストの重複要素を削除できます。組み込み関数のsorted関数は指定された要素をソートし、そのリストを返す関数です。

sorted関数にリストを渡したset関数を指定することで重複要素を削除したリストを取得できます。

>>> list1 = [5, 4, 4, 5, 54, 1]
>>> list2 = sorted(set(list1))
>>> list2
[1, 4, 5, 54]

単にsorted関数を実行するだけでは、上記のように元のリストの順序を保持しません。リストの順序を保持するために、引数keyにリストのメソッドindex()を指定します。これにより順序を保持して重複のないリストを得ることができます。

>>> list1 = [5, 4, 4, 5, 54, 1]
>>> list2 = sorted(set(list1), key=list1.index)
>>> list2
[5, 4, 54, 1]

OrderedDictによるリストの重複要素の削除(Python3.7以前)

使っているPythonのバージョンが3.7よりも以前の場合、dict.fromkeys()ではなくcollections.OrderedDictを使用してください。これは古いバージョンのPythonではdict.fromkeys()ではリストの順序を保てないためです。

OrderedDictを使用したリストから重複要素を削除する流れは以下の通りです。

  1. OrderedDictで重複を省いた辞書に変換
  2. list関数で辞書からリストへ変換

1.OrderedDictで重複を省いた辞書に変換

OrderedDict.fromkeys()の引数にリストを指定すると、重複要素を削除した要素をキーとする辞書を取得できます。

OrderedDictはcollectionsからインポートして利用します。

>>> from collections import OrderedDict
>>> list1 = [5, 4, 4, 5, 54, 1]
>>> dict1 = OrderedDict.fromkeys(list1)
>>> dict1
OrderedDict([(5, None), (4, None), (54, None), (1, None)])

2.list関数で辞書からリストへ変換

OrderedDict.fromkeys()で得られた辞書をlist関数に指定することで、辞書のキーを要素とするリストを取得できます。

>>> list2 = list(dict1)
>>> list2
[5, 4, 54, 1]

このようにOrderedDict.fromkeys()とlist関数を組み合わせることでリストから重複要素を削除できます。

Numpyによるリストの重複要素の削除

Numpyを使うことでリストの重複要素を削除することもできます。

NumpyはPythonで利用できる数値計算ライブラリです。ここではNumpyのunique()やtolist()を利用します。Numpyについて詳しくは以下記事をご参照ください。

Numpyは標準ライブラリではないため、事前にpipなどでインストールしておいてください。

>>> import numpy
>>> list1 = [5, 4, 4, 5, 54, 1]
>>> list2 = numpy.unique(list1).tolist()
>>> list2
[1, 4, 5, 54]

重要な点としてNumpyを利用した場合、元のリストの順序を保持していないことに注意してください。

Pandasによるリストの重複要素の削除

Pythonのデータ分析ライブラリであるPandasを利用してリストの重複要素を削除することができます。

>>> import pandas
>>> list1 = [5, 4, 4, 5, 54, 1]
>>> list2 = pandas.unique(list1).tolist()
>>> list2
[5, 4, 54, 1]

重要な点としてPandasの場合、元のリストの順序を保ったまま重複要素を削除できます。

まとめ

本記事「【Python】リストから重複した要素を削除する方法」はいかがでしたか。

ここで紹介したリストから重複した要素を削除する方法は以下の通りです。

削除する方法 リストの順序
dict.fromkeys() 保持する
set型への変換 保持しない
set関数とsorted関数 保持する
OrderedDict 保持する
Numpy 保持しない
Pandas 保持する

本記事で紹介した方法をぜひ利用してみてください。