1. ホーム
  2. python

[解決済み] リスト内の重複を削除する

2022-03-21 02:01:19

質問

私は、リストが重複しているかどうかをチェックし、重複している場合はそれらを削除し、重複/削除されていない項目で新しいリストを返すプログラムを書く必要があります。これは私が持っているものですが、正直なところ、私は何をすべきかわかりません。

def remove_duplicates():
    t = ['a', 'b', 'c', 'd']
    t2 = ['a', 'c', 'd']
    for t in t2:
        t.append(t.remove())
    return t

解決方法は?

ユニークなアイテムのコレクションを取得するための一般的なアプローチとして set . セットは 順序不同 のコレクションです。 明確な オブジェクトを作成します。任意の反復子からセットを作成するには、単にそれを組み込みの set() 関数があります。後で再び本当のリストが必要になった場合、同様にそのセットを list() 関数を使用します。

次の例は、あなたが行おうとしていることをすべてカバーするものです。

>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> t
[1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> list(set(t))
[1, 2, 3, 5, 6, 7, 8]
>>> s = [1, 2, 3]
>>> list(set(t) - set(s))
[8, 5, 6, 7]

結果例からわかるように 元の順序が維持されない . 前述のとおり、セット自体は順序のないコレクションなので、順序は失われます。セットをリストに戻すと、任意の順序が作成されます。

順序を維持する

もし、秩序を重視するのであれば、別の仕組みを使う必要があります。この場合、非常に一般的な解決策は OrderedDict を使用して、挿入時のキーの順序を維持します。

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]

Python 3.7で開始 また、内蔵辞書は挿入順も保証していますので、Python 3.7 以降 (または CPython 3.6) であれば、そちらを直接使用することも可能です。

>>> list(dict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]

この場合、最初に辞書を作成し、そこからリストを作成するというオーバーヘッドが発生する可能性があることに注意してください。実際に順序を保持する必要がない場合は、セットを使用した方が良い場合があります。特に、より多くの操作を行うことができます。以下はその例です。 この質問 は、重複を除去する際に順序を保持するための詳細と代替方法を示しています。


最後に set と同様に OrderedDict / dict ソリューションでは、アイテムが ハッシュ化可能 . これは通常、それらが不変でなければならないことを意味します。もしハッシュ化できない項目 (例えばリストオブジェクト) を扱わなければならない場合は、基本的にすべての項目と他のすべての項目をネストされたループで比較しなければならない、遅いアプローチを使用しなければならないでしょう。