Các thuận tiện nhất, "Pythonic" cách để loại bỏ bản sao từ một danh sách về cơ bản là:Loại bỏ trùng lặp bằng so sánh tùy chỉnh
mylist = list(set(mylist))
Nhưng giả sử tiêu chí của bạn cho đếm một bản sao phụ thuộc vào một trường thành viên cụ thể của các đối tượng chứa trong mylist
.
Vâng, có một giải pháp là chỉ cần xác định __eq__
và __hash__
cho các đối tượng trong mylist
, và sau đó là cổ điển list(set(mylist))
sẽ làm việc.
Nhưng đôi khi bạn có các yêu cầu kêu gọi linh hoạt hơn một chút. Sẽ rất thuận tiện khi có thể tạo các lambda trực tuyến để sử dụng các thói quen so sánh tùy chỉnh để xác định các bản sao theo các cách khác nhau. Lý tưởng nhất, một cái gì đó như:
mylist = list(set(mylist, key = lambda x: x.firstname))
Tất nhiên, điều đó không thực sự làm việc vì các nhà xây dựng set
không mất một chức năng so sánh, và set
đòi hỏi phím hashable là tốt.
Vậy cách gần nhất để đạt được điều gì đó như thế, để bạn có thể loại bỏ các bản sao bằng các hàm so sánh tùy ý?
Đó là cách dễ nhất để thực hiện điều này. Và hiệu suất sẽ gần như bằng với phương pháp thiết lập của bạn. – Chronial
Wow Tôi chưa từng thấy cú pháp '{x.firstname: x for x in mylist}' trước đây. Nó được gọi là gì và tôi có thể tìm thấy nó ở đâu trong tài liệu. –
@MarwanAlsabbagh: Đó là [dict comprehension] (http://www.python.org/dev/peps/pep-0274/). Nó được thêm vào trong Python 2.7 và 3.0. Nó tương đương với 'dict ((x.firstname, x) cho x trong danh sách của tôi)'. – interjay