web-dev-qa-db-ja.com

順序に関係なく、pythonリスト内の一意のタプルを取得します

pythonリストがあります:

[ (2,2),(2,3),(1,4),(2,2), etc...]

私が必要とするのは、それをその固有のコンポーネントに減らすある種の関数です...

[ (2,2),(2,3),(1,4) ]

numpy uniqueはこれを完全には行いません。私はそれを行う方法を考えることができます-タプルを数値に変換します、[22,23,14,etc.]、一意を見つけて、そこから作業をやり直します...しかし、複雑さが手に負えないかどうかはわかりません。タプルでやろうとしていることを行う関数はありますか?


これは問題を示すコードのサンプルです:

 import numpy as np

 x = [(2,2),(2,2),(2,3)]
 y = np.unique(x)

戻り値:y:[2 3]

そして、これは修正を示すソリューションの実装です:

 x = [(2,2),(2,2),(2,3)]
 y = list(set(x))

yを返します:[(2,2)、(2,3)]

11
donlan

あなたは単に行うことができます

y = np.unique(x, axis=0)
z = [] 
for i in y:
   z.append(Tuple(i))

その理由は、タプルのリストがnumpyによって2D配列として解釈されるためです。 axis = 0を設定することにより、配列をフラット化せずに一意の行を返すようにnumpyに要求します。

8
Mehdi Golari

順序が重要でない場合

結果の順序が重要でない場合は、リストをセットに変換し(タプルはハッシュ可能であるため)、セットをリストに変換します。

>>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(set(l))
[(2, 3), (1, 4), (2, 2)]

順序が重要な場合

(更新)

CPython 3.6(または任意のPython 3.7バージョン))以降、通常の辞書は挿入順序を記憶するため、簡単に発行できます。

>>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(dict.fromkeys(l))
[(2, 2), (2, 3), (1, 4)]

(古い答え)

順序が重要な場合、重複をフィルタリングする正規の方法は次のとおりです。

>>> seen = set()
>>> result = []
>>> for item in l:
...     if item not in seen:
...         seen.add(item)
...         result.append(item)
... 
>>> result
[(2, 2), (2, 3), (1, 4)]

最後に、少し遅くて少しハックで、順序付けられたセットとしてOrderedDictを乱用することができます。

>>> from collections import OrderedDict
>>> OrderedDict.fromkeys(l).keys() # or list(OrderedDict.fromkeys(l)) if using a version where keys() does not return a list
[(2, 2), (2, 3), (1, 4)]
25
timgeb

setを使用すると重複が削除され、後でlistを作成します。

>>> list(set([ (2,2),(2,3),(1,4),(2,2) ]))
[(2, 3), (1, 4), (2, 2)]
8
Mureinik

set()はすべての重複を削除し、リストに戻すことができます。

_unique = list(set(mylist))
_

ただし、set()を使用すると、順序が失われます。順序が重要な場合は、値がリストの前の方にすでに存在しているかどうかをチェックするリスト内包表記を使用できます。

_unique = [v for i,v in enumerate(mylist) if v not in mylist[:i]]
_

ただし、そのソリューションは少し遅いため、次のように実行できます。

_unique = []
for tup in mylist:
    if tup not in unique:
        unique.append(tup)
_
3
zondo