Самый быстрый способ сравнить массив массивов?
У меня есть массивы массивов, как показано ниже:
[[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))