2015-06-01 10 views
10

Chcę utworzyć listę (lub zestaw) wszystkich wartości unikatowych pojawiających się na liście list w python. mam coś takiego:Uzyskaj unikalne wartości na liście list w pythonie

aList=[['a','b'], ['a', 'b','c'], ['a']] 

i chciałbym następujące:

unique_values=['a','b','c'] 

wiem, że na liście ciągów można po prostu użyć ustawiony (ALIST), ale nie mogę jak rozwiązać ten problem na liście list, ponieważ set (aList) wyświetla mi komunikat o błędzie

unhashable type: 'list' 

Jak mogę to rozwiązać?

+0

można spłaszczyć listę jako pierwszy. https://stackoverflow.com/search?q=+python]+flatten+list (fyi, w Pythonie są to nazywane listami, a nie tablicami) –

+0

Dzięki, nie wiedziałem, który z nich był poprawny;) – mihasa

+0

Mam Zauważyłem, że robi to lista, ale ponieważ moja lista jest dość duża, domyśliłem się, że pod względem wydajności, która byłaby zła, zadzwoń pod numer – mihasa

Odpowiedz

13
array = [['a','b'], ['a', 'b','c'], ['a']] 
result = set(x for l in array for x in l) 
+0

który wykonał zadanie, dziękuję bardzo! Czy nie ma lepszego sposobu na zrobienie tego rodzaju myślenia bez potrzeby wykonywania iteracji? (Jestem początkującym, ale myślałem, że unikanie pętli było sposobem, aby przejść, mając dużą len (tablica)) – mihasa

+0

Obawiam się, że nie ma prostszego sposobu. Masz precyzyjnie zdefiniowaną strukturę wejściową, masz dokładnie zdefiniowaną strukturę wyjściową i konieczne jest dokonanie konwersji. Ponieważ konwersja obejmuje wszystkie elementy, konieczne jest "odwiedzenie" ich wszystkich. Cóż, istnieje wiele różnych sposobów na uzyskanie wyniku (zobacz inne posty), ale iteracja jest zawsze obecna wewnętrznie. – dlask

3
array = [['a','b'], ['a', 'b','c'], ['a']] 
unique_values = list(reduce(lambda i, j: set(i) | set(j), array)) 
7

Można użyć itertools „s chain spłaszczyć swoją tablicę, a następnie zadzwonić set na nim:

from itertools import chain 

array = [['a','b'], ['a', 'b','c'], ['a']] 
print set(chain(*array)) 

Jeśli spodziewasz się list obiektu:

print list(set(chain(*array))) 
+0

który również działał, dziękuję! – mihasa

+0

@mihasa Podnieś i zaakceptuj, jeśli to było pomocne. Dzięki –

+0

właśnie założyłem konto, nie mogę nic jeszcze podnieść :(Twoja odpowiedź była bardzo pomocna, ale zaakceptowałem pierwszą odpowiedź, gdy mam wystarczająco dużo punktów (lub idk, co daje prawo do podnoszenia odpowiedzi) zrobię to dla ciebie – mihasa

3

Możesz użyć numpy.unique:

import numpy 
import operator 
print numpy.unique(reduce(operator.add, [['a','b'], ['a', 'b','c'], ['a']])) 
# ['a' 'b' 'c'] 
0

Spróbuj tego.

array = [['a','b'], ['a', 'b','c'], ['a']] 
res=() 
for item in array: 
    res = list(set(res) | set(item)) 
print res 

wyjściowa:

['a', 'c', 'b']