web-dev-qa-db-ja.com

Python:リストのリストの一意性

このようなデータオブジェクトを一意化する効率的な方法は何でしょうか。

testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']
]

各データペアについて、左側の数値文字列と右側の型は、データ要素の一意性を示します。そして、testdataと同じリストのリストを返しますが、一意のもののみが存在します。

よろしく

43
Hellnar

セットを使用できます:

unique_data = [list(x) for x in set(Tuple(x) for x in testdata)]

また、 このページ を見ることができます。

80
Mark Byers

@Markの回答を試みましたが、エラーが発生しました。リストと各要素をタプルに変換することで機能しました。しかし、これが最善の方法かどうかはわかりません。

list(map(list, set(map(lambda i: Tuple(i), testdata))))

もちろん、代わりにリスト内包表記を使用して同じことを表現できます。

[list(i) for i in set(Tuple(i) for i in testdata)]

私はPython 2.6.2。

更新

@Markはその後、答えを変えました。彼の現在の答えはタプルを使用しており、動作します。だから私も:)

更新2

@Markに感謝します。タプルのリストではなくリストのリストを返すように回答を変更しました。

8
Manoj Govindan
import sets
testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']]
conacatData = [x[0] + x[1] for x in testdata]
print conacatData
uniqueSet = sets.Set(conacatData)
uniqueList = [ [t[0:-3], t[-3:]] for t in uniqueSet]
print uniqueList
1
pyfunc

@ Mark Byers ソリューションを少し拡張すると、必要なものを取得するために、リストの理解とタイプキャストを1回行うだけで済みます。

testdata = list(set(Tuple(x) for x in testdata))

また、リストの内包表記が気に入らないので気に入らない場合は、forループでも同じことができます。

for i, e in enumerate(testdata):
    testdata[i] = Tuple(e)
testdata = list(set(testdata))
1
Sam Morgan

オブジェクトのリストがある場合は、@ Mark Byersの回答を次のように変更できます。

unique_data = [list(x) for x in set(Tuple(x.testList) for x in testdata)]

testdataは、属性としてリストtestListを持つオブジェクトのリストです。

0
Khan