リストに重複があるかどうかを確認し、重複のない新しいリストを返すにはどうすればよいでしょうか?
ベストアンサー1
ユニークなアイテムコレクションを得るための一般的なアプローチは、set
セットは、異なるオブジェクトの順序のないコレクションです。任意の反復可能オブジェクトからセットを作成するには、組み込みのset()
関数。後で実際のリストが必要になった場合は、同様にセットをlist()
関数。
次の例は、あなたがしようとしていることすべてをカバーするはずです。
>>> t = [1, 2, 3, 1, 2, 3, 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
ソリューションでは、アイテムがハッシュ可能である必要があることに注意してください。これは通常、アイテムが不変でなければならないことを意味します。ハッシュ可能でないアイテム (リスト オブジェクトなど) を処理する必要がある場合は、基本的にネストされたループですべてのアイテムを他のすべてのアイテムと比較する必要がある、遅いアプローチを使用する必要があります。