Самый эффективный способ сравнения 2 списков без учета порядка - с collections.Counter
, поскольку в среднем требуется сложность времени всего за O (n), но, поскольку вы не можете его использовать, вы можете вместо этого реализовать тот жепринципал самостоятельно, используя два дикта для отслеживания количества каждого отдельного элемента в каждом списке:
def compare(l1, l2, d1=None, d2=None):
if not d1:
d1, d2 = {}, {}
if l1 and l2:
d1[l1.pop()] = d1.get(l1[-1], 0) + 1
d2[l2.pop()] = d2.get(l2[-1], 0) + 1
return compare(l1, l2, d1, d2)
elif not l1 and not l2:
return d1 == d2
return False
, так что:
print(compare([2, 3, 5, 3], [3, 5, 2, 3]))
print(compare([2, 3, 5, 2], [3, 5, 2, 3]))
print(compare([2, 3, 5, 2], [3, 5, 2]))
выведет:
True
False
False
Обратите внимание, что любой подход, который разрезает список или использует list.index
, всегда будет неэффективным, потому что требуется O (n) для выполнения каждого из них для каждого элемента в списках, что приводит к O (n ^ 2)общая сложность времени.