2015-06-01 49 views
10

我想創建列表(或設置)所有在python列表中出現的唯一值。 我有這樣的事情:在python列表中獲取唯一值列表

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

,我想以下幾點:

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

我知道,對於一個字符串列表你可以使用設置(ALIST),但我不能如何解決列表中的這個問題,因爲set(aList)給我提供了錯誤信息

unhashable type: 'list' 

我該如何解決它?

+0

您可以首先拼合列表。 https://stackoverflow.com/search?q=[python]+flatten+list(fyi,在Python中,這些被稱爲列表,而不是數組) –

+0

謝謝,我不知道哪一個是正確的;) – mihasa

+0

我已經看到列表解析這樣做,但由於我的列表非常大,我已經猜到了效率方面的問題,這將是一個不好的電話 – mihasa

回答

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

,非常感謝! 沒有更好的方式來做這種思考而無需迭代? (我是一個初學者,但我認爲避免循環是有一個大的len(陣列)時的方式) – mihasa

+0

恐怕沒有更簡單的方法。您有精確定義的輸入結構,您有精確定義的輸出結構,並且有必要進行轉換。由於轉換涉及所有元素,因此需要「訪問」所有元素。那麼,有很多不同的方法來獲得結果(見其他帖子),但迭代總是在內部存在。 – dlask

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

您可以使用itertoolschain扁平化您的數組,然後調用set它:

from itertools import chain 

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

如果你期待一個list對象:

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

也工作,謝謝! – mihasa

+0

@mihasa如果有幫助,請提出並接受。謝謝 –

+0

我剛剛創建了我的賬戶,現在還不能提出任何問題:(你的回答非常有幫助,但是我接受了第一個答案,當我有足夠的分數時(或者idk什麼時候提供答案)我會做它爲你的 – mihasa

3

您可以使用numpy.unique

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

試試這個。

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

輸出:

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