Это не очень компактно, но работает.
Поскольку вы проверяете, чтобы точное положение было одинаковым (с максимальным обменом 1), вы можете использовать один и тот же цикл.
Я заставил приведенный ниже код немедленно возвращаться, если не выполняются определенные условия, такие как длина массива и если массив даже содержит те же элементы (исключая позицию). Затем цикл for проверяет положение и пытается 1 обменять 2 элемента. Положение заменяемого элемента должно быть больше, чем в предыдущем тестировании, поскольку мы не хотим повторно тестировать элемент.
def areSimilar(a, b):
flag = False
swap = False
if len(a) is not len(b):
return False
arrlen = len(a)
if set(a) == set(b):
pos1 = None
pos2 = None
for i in range(arrlen):
if a[i] == b[i]:
flag = True
else:
if pos1 is None:
if swap is False:
swap = True
pos1 = i
pos2 = b.index(a[i])
if pos2 > i:
flag = True
else:
return False
else:
if b[pos1] == a[i]:
flag = True
else:
return False
return flag
a = [832, 998, 148, 570, 533, 561, 894, 147, 455, 279]
b = [832, 998, 148, 570, 533, 561, 455, 147, 894, 279]
print(areSimilar(a,b))