2010-09-16 37 views
23

Tôi tò mò những gì sẽ là một cách Effient của uniquefying đối tượng dữ liệu ví dụ:Python: Tính độc đáo cho danh sách liệt kê

testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH'] 
] 

Đối với mỗi cặp dữ liệu, còn lại chuỗi số PLUS loại ở bên phải nói với sự độc đáo của một phần tử dữ liệu. Và nó trả về một danh sách các danh sách giống như các testdata, nhưng chỉ có duy nhất các bản đồ có sẵn.

Trân

Trả lời

51

Bạn có thể sử dụng một bộ:

unique_data = [list(x) for x in set(tuple(x) for x in testdata)] 

Bạn cũng có thể nhìn thấy this page mà benchmarks một loạt các phương pháp mà một trong hai duy trì hoặc không giữ gìn trật tự.

+0

Lưu ý rằng bạn mất thứ tự với phương pháp này. Nếu nó có liên quan hơn bạn sẽ phải sắp xếp nó sau hoặc loại bỏ các mục theo cách thủ công. – Wolph

+1

Tôi gặp lỗi: 'LoạiError: loại không thể loại bỏ: 'list''. Python 2.6.2, Ubuntu Jaunty. –

+0

@Hellnar: anh ta chỉ cập nhật mã để sử dụng bộ dữ liệu, bây giờ bạn sẽ không gặp vấn đề đó nữa :) – Wolph

5

Tôi đã thử câu trả lời của @ Mark và gặp lỗi. Chuyển đổi danh sách và mỗi phần tử thành một bộ dữ liệu làm cho nó hoạt động. Không chắc chắn nếu điều này là cách tốt nhất mặc dù.

list(map(list, set(map(lambda i: tuple(i), testdata)))) 

Tất nhiên điều tương tự cũng có thể được diễn đạt bằng cách sử dụng danh sách thay thế.

[list(i) for i in set(tuple(i) for i in testdata)] 

Tôi đang sử dụng Python 2.6.2.

Cập nhật

từ @ Mark đã thay đổi câu trả lời của mình. Câu trả lời hiện tại của anh ta sử dụng tuple và sẽ hoạt động. Vì vậy, tôi sẽ :)

Cập nhật 2

Nhờ @ Mark. Tôi đã thay đổi câu trả lời của mình để trả về danh sách các danh sách thay vì danh sách các bộ dữ liệu.

+0

@Mark: xong. Cảm ơn! –

+0

Đây là một mẹo nhỏ: thay vì 'lambda x: foo (x)' bạn chỉ có thể viết 'foo'. –

+0

@Mark: Nơi 'foo' là một cuộc gọi. Gotcha. –

1
import sets 
testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']] 
conacatData = [x[0] + x[1] for x in testdata] 
print conacatData 
uniqueSet = sets.Set(conacatData) 
uniqueList = [ [t[0:-3], t[-3:]] for t in uniqueSet] 
print uniqueList 
+0

Các câu trả lời khác là cách mát mẻ hơn! – pyfunc

+2

Ngoài ra, mô-đun bộ bị ngừng sử dụng, thay vào đó hãy sử dụng loại bộ dựng sẵn. –

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