Найкращий спосіб зробити це - сортування списків та порівняння їх. (Використання Counter
не буде працювати з об'єктами, які не підлягають перегляду.) Це зрозуміло для цілих чисел:
sorted(a) == sorted(b)
Це стає трохи складніше з довільними предметами. Якщо ви дбаєте про ідентифікацію об'єкта, тобто про те, чи є однакові об’єкти в обох списках, ви можете використовувати id()
функцію як ключ сортування.
sorted(a, key=id) == sorted(b, key==id)
(У Python 2.x насправді це не потрібно key=
параметр, тому що ви можете порівнювати будь-який об’єкт з будь-яким об'єктом. Порядок впорядкування є довільним, але стабільним, тому він цілком працює для цієї мети; не має значення, в якому порядку розташовані об'єкти лише в тому, що впорядкування є однаковим для обох списків. Однак у Python 3 порівняння об'єктів різних типів заборонено за багатьох обставин - наприклад, ви не можете порівнювати рядки з цілими числами - тому якщо у вас будуть об'єкти різних типів, найкраще явно використовувати ідентифікатор об’єкта.)
Якщо ви хочете порівняти об’єкти у списку за значенням, з іншого боку, спочатку потрібно визначити, що означає "значення" для об'єктів. Тоді вам знадобиться якийсь спосіб забезпечити це як ключем (і для Python 3, як послідовний тип). Один з потенційних способів, який би працював для багатьох довільних об'єктів, - це сортування за їхніми ознаками repr()
. Звичайно, це може витратити багато зайвого часу та repr()
рядків для створення пам'яті для великих списків тощо.
sorted(a, key=repr) == sorted(b, key==repr)
Якщо об'єкти всі ваші власні типи, ви можете визначити __lt__()
їх, щоб об’єкт знав, як порівнювати себе з іншими. Тоді ви можете просто сортувати їх і не турбуватися про key=
параметр. Звичайно, ви також можете визначити __hash__()
та використовувати Counter
, що буде швидше.