14

リスト内包表記を使用してリストから重複アイテムを削除するにはどうすればよいですか?私は次のコードを持っています:

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]

しかし、それは機能せず、同じリストを生成するだけです。なぜ同じリストを作成するのですか?

4

8 に答える 8

14

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]
于 2012-05-11T10:09:33.967 に答える
12

リスト内包表記とは異なる手法を使用してもかまわない場合は、そのためのセットを使用できます。

>>> 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]
于 2012-05-11T10:06:49.077 に答える
5

キーとしての値を使用keysしてdict構築されたもので使用しaます。

b = dict([(i, 1) for i in a]).keys()

または、セットを使用します。

b = [i for i in set(a)]
于 2012-05-11T10:07:06.580 に答える
4

リストが変更さbれていない理由は、最初は空であるためです。これは、それif item not in bが常にであることを意味しますTrue。リストが生成された後でのみ、この新しい空でないリストが変数に割り当てられますb

于 2012-05-11T10:09:47.803 に答える
4

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モジュールにはいくつかの非常に便利な関数があります: chainteeそしていくつか例を挙げるとproduct

于 2012-05-11T12:14:51.903 に答える
1
>>> 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)
于 2016-06-03T07:01:06.800 に答える
1
>>> 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]
于 2019-12-11T10:45:50.420 に答える
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

于 2020-12-10T02:40:04.493 に答える