Python: уникальность списка списков - PullRequest
39 голосов
/ 16 сентября 2010

Мне любопытно, каким был бы эффективный способ уникального определения таких объектов данных:

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

Для каждой пары данных левая числовая строка PLUS, тип справа указывает уникальность элемента данных.И он возвращает список списков, таких же, как у тестовых данных, но существуют только уникальные.

С уважением

Ответы [ 5 ]

78 голосов
/ 16 сентября 2010

Вы можете использовать набор:

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

Вы также можете увидеть эту страницу , в которой указаны различные методы, которые либо сохраняют, либо не сохраняют порядок.

8 голосов
/ 16 сентября 2010

Я попытался ответить @ 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.

Обновление

@ Марк с тех пор изменил свой ответ. Его текущий ответ использует кортежи и будет работать. Так будет и моя :)

Обновление 2

Благодаря @Mark. Я изменил свой ответ, чтобы вернуть список списков, а не список кортежей.

1 голос
/ 16 сентября 2010
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
0 голосов
/ 02 марта 2019

если у вас есть список объектов, вы можете изменить ответ @Mark Byers на:

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

, где testdata - это список объектов, у которого в качестве атрибута есть список testList.

0 голосов
/ 11 октября 2018

Немного расширив решение @ Mark Byers , вы также можете просто сделать одно понимание списка и выполнить тип, чтобы получить то, что вам нужно:

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

Кроме того, если вы этого не сделаетеподобно тому, как многие списки воспринимают их как запутанные, вы можете сделать то же самое в цикле for:

for i, e in enumerate(testdata):
    testdata[i] = tuple(e)
testdata = list(set(testdata))
...