2013-03-20 8 views
-3

дан список списков:Python: уникальность в списке списков

L = [[1,2,3], [3,4,5], [1,2,3]] 

как получить список, где каждый список уникален:

L = [[1,2,3], [3,4,5]] 

благодаря

+5

Что вы пробовали уже? Как вы определяете уникальность? Является ли '[1,2,3]' таким же, как '[3,2,1]'? – thegrinner

+0

Большинство решений для составления списков содержат только уникальные элементы, которые должны одинаково хорошо работать для списков списков. – drewmm

+0

@thegrinner да, я уже пробовал и искал google, и поэтому для ответа, который я ничего не нашел – Mermoz

ответ

3

Если вы не» t заботиться о порядке подписок:

In [11]: list(map(list, set(map(tuple, L)))) 
Out[11]: [[3, 4, 5], [1, 2, 3]] 

. Еще лучше, вы должны просто перейти к использованию наборов кортежей в качестве структуры данных.

+2

Адаптация этого для сохранения порядка: 'sorted (map (list, set (map (tuple, L))), key = L.index)' –

+0

@FJ: Хороший трюк. – NPE

+0

Не самый эффективный метод, но он лаконичен. –

2

Немного смешалось, но как насчет этого?

[list(el) for el in set(tuple(el) for el in L)] 

Это работает, потому что списки нельзя сравнивать друг с другом, но кортежи могут. Сообщение об ошибке дает его прочь, если вы попытаетесь сразу сделать набор из списка списков:

unhashable type: 'list' 
+0

Осторожно, 'list' можно сравнить друг с другом' [1] == [1] 'работает отлично. 'list' не хешируются, но поскольку они являются изменяемыми объектами. – mgilson

+0

Да, это неправильно. К счастью, вы можете больше зависеть от сообщения об ошибке Python –

1
L = [[1,2,3], [3,4,5], [1,2,3]] 
newlist = [] 
for item in L: 
    if item not in newlist: 
     newlist.append(item) 
+0

Это будет работать, но может быть немного неэффективным, когда 'L' является большим, потому что каждый раз ему приходится сканировать все' newlist' для каждого 'item' в' L' , – DSM

0

Вы можете преобразовать в набор кортежей, а затем вернуться к списку.

L = [[1,2,3], [3,4,5], [1,2,3]] 
setL = set(tuple(i) for i in L) 
newL = list(list(i) for i in setL) 
print newL 

[[3, 4, 5], [1, 2, 3]]

Смежные вопросы