Проверить массивы на равенство, при этом порядок не важен

Всем привет, можете подсказать как проверить 2 массива на равенство, что бы были одинаковые элементы, при этом порядок не важен. Например:

a = [1,2,3]
b = [2,1,3] # массивы a и b равны по элементам, но не равны по порядку

Ответы (5 шт):

Автор решения: Эникейщик

Сравнить сортированные версии:

a = [1,2,3]
b = [2,1,3]

a.sort()
b.sort()

if a == b:
    print("ok")
→ Ссылка
Автор решения: AivanF.

Можно использовать collections.Counter и сравнение полученных словарей. В отличие от варианта с сортировкой, этот способ сработает даже если в списке находятся объекты разных типов.

import collections

a = [1,2,3]
b = [2,1,3]

ac = collections.Counter(a)
bc = collections.Counter(b)

print(ac == bc)  # True
→ Ссылка
Автор решения: vadim vaduxa

как вариант, не самый лучший

all(a.count(x) == b.count(x) for x in set(a+b))
→ Ссылка
Автор решения: Константин
a = [1,2,3]
b = [2,1,3] # массивы a и b равны по элементам, но не равны по порядку
def is_equal(l1, l2):
    this_is_succf_cross_eq_end = False
    this_is_succf_end_row=False
    is_in_array=False
    res = 'ne ravni'
    el_has_passed= False
    for elem in range(len(l1)):
        for elem_another in range(len(l2)):
            is_in_array = elem_another < len(l2)
            if l1[elem]==l2[elem_another] and is_in_array:
                el_has_passed=True
                is_in_array = elem_another == len(l2)-1
                print("is_in_array",is_in_array)
        if is_in_array and el_has_passed:
            this_is_succf_cross_eq_end = True
            print("opp!")
            continue

        else:
            this_is_succf_cross_eq_end=False
            print("nnn")
            break

    if this_is_succf_cross_eq_end:
        res = 'ravni'
    return res

if __name__ == '__main__':

  print(is_equal(a,b)) #--->ravni
  a[0]=8
  print(is_equal(a, b)) #--->ne ravni

Вот исправленный(Ух запарился я ребятки,зато сам кое-что разобрал:)) С одинаковой размерностью:

a = [1,2,3]
b = [3,1,2] # массивы a и b равны по элементам, но не равны по порядку
def is_equal(l1, l2):
    res = 'ne ravni'
    el_has_passed= False
    passed_row_l=[]
    for elem in range(len(l1)):
        for elem_another in range(len(l2)):
            # print("fix elem",l1[elem])
            # print("another elem",l2[elem_another])
            if l1[elem]==l2[elem_another] :
                el_has_passed=True
                break
            else:
                el_has_passed=False
            # print("el has passed",el_has_passed)
        if el_has_passed:
          passed_row_l.append(1)
        else:
            passed_row_l.append(0)
        # print("l",passed_row_l)

    if sum(passed_row_l)==len(l1):
        res = 'ravni'
    return res

if __name__ == '__main__':
  # Проверял для списков одинаковой размерности
  print(is_equal(a,b)) #--->ravni
  a.append(8)
  b.append(9)
  print(is_equal(a, b)) #--->ne ravni
  b[-1]=8
  print(is_equal(a, b)) #--->ravni
→ Ссылка
Автор решения: Платон Хаматов
a = [1, 2, 3]
b = [2, 3, 1]
print(sorted(a) == sorted(b))

Все зависит от нужного времени выполнения. Встроенная сортировка работает за O(n log n)

→ Ссылка