Pythonでリストのリストをユニークにする方法

Pythonには配列をユニークにする「unique」的な関数がありません(pandasにはあるそうです)。
Pythonでリスト(配列)をユニークにするには次のようにします。

要素が値の場合

list_value = [1, 2, 3, 1, 2, 3]
this_set = set(list_value)
result_list = list(this_set)
print(result_list)
# [1, 2, 3]

setを使うとセットが生成されます。セットは重複が許されないのでこれによりユニークになります。
listを使って配列に戻します。

要素がリストの場合

リストの要素がリストの場合(配列の中身が配列の場合)は次のようにします。

list_list = [[1,2,3],[1,2,4],[2,3,4],[1,2,3],[1,2,4],[2,3,4]]
list_tuple = list(map(tuple, list_list))
this_set = set(list(list_tuple))
result_list = list(this_set)
print(result_list)
# [(2, 3, 4), (1, 2, 4), (1, 2, 3)]

要素が配列の場合はそのままセットを生成できません。
要素である各リストををタプルに変換する必要があります。tupleを使うとリストをタプルに変換できます。mapを使うと関数を各要素に適用することができます。これを使い各リストをタプルに変換します。
要素がタプルであればセットを生成できるので後は上の例と同じです。

なおsetを使ってユニークにすると順序が保証されません。

要素が辞書型の場合

リストの要素が辞書型(dictionary)の場合は次のようにします。

recs = [{"kanji": "山", "yomi": "やま"},
        {"kanji": "谷", "yomi": "たに"},
        {"kanji": "山", "yomi": "さん"},
        {"kanji": "山", "yomi": "やま"}]
map_tuple = map(lambda rec: tuple(rec.items()), recs)
this_set = set(map_tuple)
result_list = list(map(lambda t: dict(t),this_set))
print(result_list)
# [{'kanji': '山', 'yomi': 'さん'},
#  {'kanji': '谷', 'yomi': 'たに'},
#  {'kanji': '山', 'yomi': 'やま'}]

コメント

タイトルとURLをコピーしました