2015-06-01 72 views
10

Tôi muốn tạo danh sách (hoặc bộ) của tất cả các giá trị duy nhất xuất hiện trong danh sách các danh sách trong python. Tôi có một cái gì đó như thế này:Lấy các giá trị duy nhất trong Danh sách Danh sách trong python

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

và tôi muốn những điều sau đây:

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

Tôi biết rằng đối với một danh sách các chuỗi bạn chỉ có thể sử dụng thiết lập (alist), nhưng tôi không thể tìm cách giải quyết vấn đề này trong danh sách các danh sách, vì tập hợp (aList) đưa cho tôi thông báo lỗi

unhashable type: 'list' 

Làm cách nào để giải quyết?

+0

Bạn có thể san bằng danh sách đầu tiên. https://stackoverflow.com/search?q=[python]+flatten+list (fyi, bằng Python được gọi là danh sách, không phải mảng) –

+0

Cảm ơn, tôi không biết cái nào là chính xác;) – mihasa

+0

Tôi đã thấy danh sách comprehensions làm điều đó, nhưng kể từ khi danh sách của tôi là khá lớn, tôi đã đoán rằng về hiệu quả đó sẽ là một cuộc gọi xấu – mihasa

Trả lời

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

đã thực hiện công việc, cảm ơn bạn rất nhiều! Không có cách nào tốt hơn để làm kiểu suy nghĩ này mà không cần phải lặp lại? (Tôi là một người mới bắt đầu nhưng tôi nghĩ rằng tránh vòng là cách để đi khi có một len ​​lớn (mảng)) – mihasa

+0

Tôi sợ không có cách nào đơn giản hơn. Bạn có cấu trúc đầu vào được xác định chính xác, bạn có cấu trúc đầu ra được xác định chính xác và cần thiết để thực hiện chuyển đổi. Kể từ khi chuyển đổi liên quan đến tất cả các yếu tố cần thiết để "truy cập" tất cả chúng. Vâng, có nhiều cách khác nhau để có được kết quả (xem các bài viết khác) nhưng lặp lại luôn luôn hiện diện trong nội bộ. – dlask

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

Bạn có thể sử dụng itertools 's chain để san bằng mảng của bạn và sau đó gọi set vào nó:

from itertools import chain 

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

Nếu bạn đang mong đợi một đối tượng list:

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

cũng đã hoạt động, cảm ơn! – mihasa

+0

@mihasa Nâng cao và chấp nhận nếu nó hữu ích. Cảm ơn –

+0

Tôi vừa mới tạo tài khoản của mình, không thể nêu bất kỳ điều gì :(Câu trả lời của bạn rất hữu ích, nhưng tôi đã chấp nhận câu trả lời đầu tiên. Khi tôi có đủ điểm (hoặc idk, điều gì mang lại cho phép nâng cao câu trả lời) tôi sẽ làm nó cho bạn của bạn – mihasa

3

Bạn có thể sử dụng numpy.unique:

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

Hãy thử điều này.

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

Output:

['a', 'c', 'b'] 
Các vấn đề liên quan