HOWTO · Python
Python でリストから重複を削除する
今回は、セットデータ構造と OrderDict を使って Python でリストから重複を削除する方法について解説します。
このページの内容
Python のリストは、データを特定の順序で格納するためのデータ構造です。リストは、int、float、文字列、別のリストなど、複数の型のデータを格納することができます。リストは変異可能であり、一度作成された値は後で変更できることを意味します。リストは角括弧 [] で表されます。
myList = [2, 1, 2, 3, 0, 6, 7, 6, 4, 8]
print(myList)
出力:
[2, 1, 2, 3, 0, 6, 7, 6, 4, 8]
以下に示すように、for ループを使って上のリストから重複した要素を削除できます。
myList = [2, 1, 2, 3, 0, 6, 7, 6, 4, 8]
resultantList = []
for element in myList:
if element not in resultantList:
resultantList.append(element)
print(resultantList)
出力:
[2, 1, 3, 0, 6, 7, 4, 8]
これだけのコードを書きたくない場合は、Python でリストから重複した要素を削除する最もポピュラーな方法が 2つあります。
- 重複した要素を削除した後にリスト内の要素の順番を維持したくない場合は、
Setデータ構造体を使用することができます。 - 重複した要素を削除した後もリスト内の要素の順序を維持したい場合は、
OrderedDictと呼ばれるものを使用することができます。
Python の set() 関数を使ってリストから重複を削除する
リストから重複を削除するには、Set と呼ばれる別のデータ構造を使用することができます。セットは一意の値のみを含む順序のないデータ型です。セットが値を格納する順序は、セットに要素を挿入した順序とは異なります。セットは中括弧 {} で表現されます。
そのため、セットの中に格納されている要素を出力するときはいつでも、出力の順番が異なります。これが、セットが順番がないためにインデックス作成ができない理由です。
mySet = {80, 10, 50, 18, 3, 50, 8, 18, 9, 8}
print(mySet)
出力:
{3, 8, 9, 10, 80, 18, 50}
要素を出力した後、要素の順序がどのように変化したかに注目してください。
セットでは、重複は許されません。つまり、同じ要素を複数回持っていても、セットはそれを 1つの要素とみなします。これが、Python でリストから重複した要素を削除するためにセットを使用する理由です。
original_list = [80, 10, 50, 18, 3, 50, 8, 18, 9, 8]
print("Original List is: ", original_list)
convert_list_to_set = set(original_list)
print("Set is: ", convert_list_to_set)
new_list = list(convert_list_to_set)
print("Resultant List is: ", new_list)
original_list = list(convert_list_to_set)
print("Removed duplicates from original list: ", original_list)
出力:
Original List is: [80, 10, 50, 18, 3, 50, 8, 18, 9, 8]
Set is: {3, 8, 9, 10, 80, 18, 50}
Resultant List is: [3, 8, 9, 10, 80, 18, 50]
Removed duplicates from original list: [3, 8, 9, 10, 80, 18, 50]
関数 set() を適用してリストを集合に変換します。次に、list() 関数を適用して重複を除去した集合をリストに変換します。
Python で OrderDict を用いて重複を削除してリストの順序を維持する
重複した要素を削除するためにセットを使用する場合の問題点は、特定の順番で要素を保存しないことです。したがって、結果として得られるリスト、つまり重複を削除した後に作成したリストに要素が格納される順番を気にしない場合は、Set データ構造体を使用することができます。
しかし、重複を削除した後もリスト内の要素の順序を維持したい場合は、Python の OrderedDict を使用することができます。OrderDict は、リストに要素が挿入された順番を保持します。OrderDict を使用するためには、まず Python の collections モジュールから from collections import OrderedDict をインポートする必要があります。
from collections import OrderedDict
myList = [2, 1, 2, 3, 0, 6, 7, 6, 8, 0, 4, 8]
final_list = list(OrderedDict.fromkeys(myList))
print(final_list)
出力:
[2, 1, 3, 0, 6, 7, 8, 4]