Cách tốt nhất để làm điều này là bằng cách sắp xếp các danh sách và so sánh chúng. (Sử dụng Counter
sẽ không hoạt động với các đối tượng không thể băm được.) Điều này rất đơn giản đối với số nguyên:
sorted(a) == sorted(b)
Nó được một chút phức tạp hơn với các đối tượng tùy ý. Nếu bạn quan tâm đến danh tính đối tượng, tức là, liệu các đối tượng giống nhau có trong cả hai danh sách hay không, bạn có thể sử dụng id()
hàm làm khóa sắp xếp.
sorted(a, key=id) == sorted(b, key==id)
(Trong Python 2.x bạn không thực sự cần key=
tham số, bởi vì bạn có thể so sánh bất kỳ đối tượng nào với bất kỳ đối tượng nào. Thứ tự là tùy ý nhưng ổn định, vì vậy nó hoạt động tốt cho mục đích này; trong đó, chỉ có thứ tự là giống nhau cho cả hai danh sách. Tuy nhiên, trong Python 3, việc so sánh các đối tượng thuộc các loại khác nhau không được phép trong nhiều trường hợp - ví dụ: bạn không thể so sánh các chuỗi với số nguyên - vì vậy nếu bạn sẽ có các đối tượng thuộc nhiều loại khác nhau, tốt nhất là sử dụng rõ ràng ID của đối tượng.)
Nếu bạn muốn so sánh các đối tượng trong danh sách theo giá trị, mặt khác, trước tiên bạn cần xác định "giá trị" nghĩa là gì đối với các đối tượng. Sau đó, bạn sẽ cần một số cách để cung cấp khóa đó (và cho Python 3, dưới dạng một loại nhất quán). Một cách tiềm năng có thể làm việc cho nhiều đối tượng tùy ý là sắp xếp theo chúng repr()
. Tất nhiên, điều này có thể lãng phí rất nhiều thời gian và repr()
chuỗi xây dựng bộ nhớ cho các danh sách lớn, v.v.
sorted(a, key=repr) == sorted(b, key==repr)
Nếu các đối tượng là tất cả các loại của riêng bạn, bạn có thể xác định __lt__()
trên chúng để đối tượng biết cách so sánh chính nó với các đối tượng khác. Sau đó, bạn có thể chỉ cần sắp xếp chúng và không lo lắng về key=
tham số. Tất nhiên bạn cũng có thể xác định __hash__()
và sử dụng Counter
, sẽ nhanh hơn.