2010-09-29 63 views
7

Tôi có một 2-d mảngloại bỏ các mục trùng lặp khỏi mảng đa d trong python

xx=[[a,1],[b,2],[c,3]] 

Bây giờ tôi đang cố gắng để loại bỏ các mục trùng lặp khỏi nó. Đối với mảng 1-D đơn giản, mã đơn giản như

xx=list(set(xx)) 

sẽ hoạt động. Nhưng cố gắng thiết lập trên 2-d yếu tố đưa ra một lỗi

temp = set(xx) 
TypeError: unhashable type: 'list' 

Một workaround sẽ được serialize yếu tố xx, và sau đó làm một danh sách (set()) trên mảng mới và sau đó unserialize tất cả các yếu tố trở lại.

Có giải pháp nào trong python không?

Trả lời

16

Chuyển đổi các phần tử thành bộ và sau đó sử dụng set.

>>> xx=[['a',1],['b',2],['c',3],['c',3]] 
>>> set(tuple(element) for element in xx) 
set([('a', 1), ('b', 2), ('c', 3)]) 
>>> 

Tuples, không giống như danh sách, có thể được băm. Vì thế. Và khi bạn đã hoàn tất, hãy chuyển đổi các phần tử trở lại danh sách. Đưa tất cả mọi thứ với nhau:

>>> [list(t) for t in set(tuple(element) for element in xx)] 
[['a', 1], ['b', 2], ['c', 3]] 
+0

bằng cách nào đó mã không thể xóa các mục trùng lặp. set() không thể phát hiện các tuple trùng lặp? – Neo

+0

@Neo: Điều này thật thú vị. Bạn có thể đăng một số giá trị mẫu không? –

+0

chuỗi và số cùng giá trị hoặc gần như cùng số dấu phẩy động có thể? –

3

Một năm sau khi câu trả lời tuyệt vời của Manoj Govindan, tôi thêm mảnh của tôi về lời khuyên:

Floating số điểm chỉ là một nỗi đau nếu bạn muốn so sánh mọi thứ ...

Ví dụ,

>>> 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 == 0,1 * 10

False

Đó là vì máy tính của bạn không thể đại diện chính xác các dấu phẩy thập phân dưới dạng số nhị phân (máy tính xử lý số nhị phân/cơ số 2 chứ không phải số thập phân/cơ sở 10).

Vì vậy, hãy thực sự cẩn thận khi so sánh nổi!

Các vấn đề liên quan