Лучший способ сделать это - отсортировать списки и сравнить их. (Использование Counter
не будет работать с объектами, которые не хешируются.) Это просто для целых чисел:
sorted(a) == sorted(b)
С произвольными объектами становится немного сложнее. Если вы заботитесь об идентичности объекта, то есть о том, находятся ли одни и те же объекты в обоих списках, вы можете использовать эту id()
функцию в качестве ключа сортировки.
sorted(a, key=id) == sorted(b, key==id)
(В Python 2.x вам фактически не нужен key=
параметр, потому что вы можете сравнивать любой объект с любым объектом. Порядок произвольный, но стабильный, поэтому он отлично подходит для этой цели; не имеет значения, в каком порядке находятся объекты in, только порядок одинаков для обоих списков. Однако в Python 3 сравнение объектов разных типов запрещено во многих случаях - например, вы не можете сравнивать строки с целыми числами - поэтому, если у вас будут объекты различных типов, лучше всего явно использовать идентификатор объекта.)
С другой стороны, если вы хотите сравнить объекты в списке по значению, сначала вам нужно определить, что означает «значение» для объектов. Затем вам понадобится какой-то способ предоставить это в качестве ключа (а для Python 3 - как согласованный тип). Один из возможных способов, который сработает для множества произвольных объектов, - это сортировка по их repr()
. Конечно, это может привести к потере уймы лишнего времени и repr()
строк построения памяти для больших списков и так далее.
sorted(a, key=repr) == sorted(b, key==repr)
Если все объекты относятся к вашим собственным типам, вы можете определить __lt__()
их, чтобы объект знал, как сравнивать себя с другими. Тогда вы можете просто отсортировать их и не беспокоиться о key=
параметре. Конечно, вы также можете определить __hash__()
и использовать Counter
, что будет быстрее.