リスト内包表記を使用してリストから重複アイテムを削除するにはどうすればよいですか?私は次のコードを持っています:
a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
b = []
b = [item for item in a if item not in b]
しかし、それは機能せず、同じリストを生成するだけです。なぜ同じリストを作成するのですか?
リスト内包表記を使用してリストから重複アイテムを削除するにはどうすればよいですか?私は次のコードを持っています:
a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
b = []
b = [item for item in a if item not in b]
しかし、それは機能せず、同じリストを生成するだけです。なぜ同じリストを作成するのですか?
b
実行時に要素を含まないものと同じリストを生成します。あなたがそれを望むもの:
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> b = []
>>> [b.append(item) for item in a if item not in b]
[None, None, None, None, None, None, None, None]
>>> b
[1, 2, 3, 5, 9, 6, 8, 7]
リスト内包表記とは異なる手法を使用してもかまわない場合は、そのためのセットを使用できます。
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> b = list(set(a))
>>> print b
[1, 2, 3, 5, 6, 7, 8, 9]
キーとしての値を使用keys
してdict
構築されたもので使用しa
ます。
b = dict([(i, 1) for i in a]).keys()
または、セットを使用します。
b = [i for i in set(a)]
リストが変更さb
れていない理由は、最初は空であるためです。これは、それif item not in b
が常にであることを意味しますTrue
。リストが生成された後でのみ、この新しい空でないリストが変数に割り当てられますb
。
groupbyを使用する:
>>> from itertools import groupby
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> [k for k, _ in groupby(sorted(a, key=lambda x: a.index(x)))]
[1, 2, 3, 5, 9, 6, 8, 7]
値が元のリストに最初に表示された順序を気にしない場合は、重要な引数を省略してください。
>>> [k for k, _ in groupby(sorted(a))]
[1, 2, 3, 5, 6, 7, 8, 9]
あなたはでいくつかのクールなことをすることができますgroupby
。複数回表示されるアイテムを識別するには:
>>> [k for k, v in groupby(sorted(a)) if len(list(v)) > 1]
[2, 3, 5, 8]
または、頻度辞書を作成するには:
>>> {k: len(list(v)) for k, v in groupby(sorted(a))}
{1: 1, 2: 3, 3: 4, 5: 4, 6: 1, 7: 1, 8: 2, 9: 1}
itertoolsモジュールにはいくつかの非常に便利な関数があります: chain
、tee
そしていくつか例を挙げるとproduct
!
>>> a = [10,20,30,20,10,50,60,40,80,50,40,0,100,30,60]
>>> [a.pop(a.index(i, a.index(i)+1)) for i in a if a.count(i) > 1]
>>> print(a)
>>> from itertools import groupby
>>> repeated_items = [2,2,2,2,3,3,3,3,4,5,1,1,1]
>>> [
... next(group)
... for _, group in groupby(
... repeated_items,
... key=repeated_items.index
... )
... ]
[2, 3, 4, 5, 1]
Python 3.6以降では、Niek de Kleinの最も優れたソリューションよりも改善されています(入力の順序が失われることが主な欠点です)。sは挿入順序になっているのでdict
、次のようにすることができます。
b = list(dict.fromkeys(a))
以前のPythonでは、次のようにします。
from collections import OrderedDict
b = list(OrderedDict.fromkeys(a))
ただし、それほど高速ではありません(Cレイヤーに移動した場合でも、サポートされていないOrderedDict
並べ替え操作をサポートするために多くのオーバーヘッドが発生しました)。dict