web-dev-qa-db-fra.com

Python: Unicité pour une liste de listes

Je suis curieux de savoir quel serait un moyen efficace de personnaliser de tels objets de données:

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']
]

Pour chaque paire de données, la chaîne numérique de gauche PLUS le type à droite indiquent l'unicité d'un élément de données. Et il retourne une liste de listes identiques à celles de testdata, mais seuls les uniques sont existants.

Cordialement

33
Hellnar

Vous pouvez utiliser un ensemble:

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

Vous pouvez également voir cette page qui référence une variété de méthodes qui préservent ou non l'ordre.

69
Mark Byers

J'ai essayé la réponse de @ Mark et j'ai eu une erreur. La conversion de la liste et de chacun des éléments en un tuple a permis son bon fonctionnement. Je ne sais pas si c'est le meilleur moyen cependant.

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

Bien sûr, la même chose peut être exprimée en utilisant une liste de compréhension.

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

J'utilise Python 2.6.2.

Mettre à jour

@Mark a depuis changé sa réponse. Sa réponse actuelle utilise des tuples et fonctionnera. Alors le mien :) 

Mise à jour 2

Merci à @Mark. J'ai changé ma réponse pour retourner une liste de listes plutôt qu'une liste de n-uplets. 

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

En développant un peu la solution @Mark Byers , vous pouvez également faire une compréhension et une conversion de liste pour obtenir ce dont vous avez besoin:

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

De plus, si vous n'aimez pas les compréhensions de liste car beaucoup les trouvent déroutantes, vous pouvez faire la même chose dans une boucle for:

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

si vous avez une liste d'objets que vous pouvez modifier, répondez à @Mark Byers:

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

où testdata est une liste d'objets ayant une liste testList en tant qu'attribut.

0
Khan