Как я написал в комментарии, никогда не используйте list
(или любые встроенные) в качестве имени переменной:
L = [['1', '2'], ['1', '3'], ['1', '4'], ['1', '5'], ['2', '1'], ['4', '1'], ['2', '6']]
Посмотрите свой код:
for i in range(len(L)):
if L[i] == L[i][::-1]:
print("Match found")
del L[i][::-1]
Есть две проблемы. Сначала вы сравниваете L[i]
с L[i][::-1]
, но вы хотите сравнить L[i]
с L[j][::-1]
для любого j != i
. Во-вторых, вы пытаетесь удалить элементы списка во время итерации. Если вы удаляете элемент, длина списка уменьшается, и индекс l oop будет за пределами списка:
>>> L = [1,2,3]
>>> for i in range(len(L)):
... del L[i]
...
Traceback (most recent call last):
...
IndexError: list assignment index out of range
Чтобы исправить первую проблему, вы можете повторить итерацию дважды элементы: существует ли для каждого элемента другой элемент, противоположный первому? Чтобы исправить вторую проблему, у вас есть два варианта: 1. создать новый список; 2. действуйте в обратном порядке, чтобы удалить первые последние индексы.
Первая версия:
new_L = []
for i in range(len(L)):
for j in range(i+1, len(L)):
if L[i] == L[j][::-1]:
print("Match found")
break
else: # no break
new_L.append(L[i])
print(new_L)
Вторая версия:
for i in range(len(L)-1, -1, -1):
for j in range(0, i):
if L[i] == L[j][::-1]:
print("Match found")
del L[i]
print(L)
(Для лучшей временной сложности , см. ответ @ yatu.)
Для однострочника вы можете использовать модуль functools
:
>>> L = [['1', '2'], ['1', '3'], ['1', '4'], ['1', '5'], ['2', '1'], ['4', '1'], ['2', '6']]
>>> import functools
>>> functools.reduce(lambda acc, x: acc if x[::-1] in acc else acc + [x], L, [])
[['1', '2'], ['1', '3'], ['1', '4'], ['1', '5'], ['2', '6']]
logi c то же, что и лог c первой версии.