Самый быстрый способ сравнить массив массивов?

У меня есть массивы массивов, как показано ниже:

[[0, 3], [0, 4, 1, 5], [0, 2]]
[[0, 4, 1, 5], [0, 3], [0, 2]]
[[0, 2], [0, 4, 1, 5], [0, 3]]

[[0, 4, 1, 5, 3], [0, 2]]
[[0, 4, 1, 5, 3, 2]]

Если вы посмотрите на первые 3 примера, это один и тот же массив, просто упорядоченный по-разному.

В любой момент я должен сравнить два таких AoA и выяснить, совпадают ли они.

Какой самый быстрый способ сделать это? Сами массивы небольшие, но мне приходится делать эту проверку очень часто.

2 ответа

Решение

Вы можете преобразовать подсписки в кортежи (неизменяемые), используя map(tuple,list)) + сортировка основного списка (который сортирует кортежи на основе целочисленного упорядочения элементов).

l1 = [[0, 3], [0, 4, 1, 5], [0, 2]]
l2 = [[0, 4, 1, 5], [0, 3], [0, 2]]
l3 = [[0, 2], [0, 4, 1, 5], [0, 3]]
print (sorted(map(tuple,l1)) == sorted(map(tuple,l2)))
#True
print(sorted(map(tuple,l2)) == sorted(map(tuple,l3)))
#True
print (sorted(map(tuple,l3)) == sorted(map(tuple,l1)))
#True

l4 = [[0, 4, 1, 5, 3], [0, 2]]
l5 = [[0, 4, 1, 5, 3, 2]]
sorted(map(tuple,l4)) == sorted(map(tuple,l5))
#False

Одним из способов является выравнивание двух массивов и сравнение. Как это:

list1 = [[0, 3], [0, 4, 1, 5], [0, 2]]

list2 = [[0, 4, 1, 5], [0, 3], [0, 2]]

def flat (ls): вернуть [val для подсписка в ls для val в подсписке]

set (flat (list1)) == set (flat (list2))

Другие вопросы по тегам