Проверить массивы на равенство, при этом порядок не важен
Всем привет, можете подсказать как проверить 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)