Нужно удалить из списка в вхождения, да не просто по элементам, а прям множество. Т.е. если есть список: [0, 1, 2, 3, 1, 5, 3, 7], и например, кортеж, который удаляемых элементов (1, 5, 3), нужно, чтобы в итоге получился список [0, 1, 2, 3, 7]. Как можно легче всего такое реализовать?
Ответ
Я бы попробовал что-то вроде такого:
1) изменение списка на месте (чуть сложнее)
def is_equal(lst, pattern):
if len(lst) != len(pattern):
return False
for a, b in zip(lst, pattern):
if a != b:
return False
return True
def clear_list(lst, pattern):
index = []
l = len(pattern)
rng = iter(xrange(len(lst)))
while True:
try:
i = next(rng)
if is_equal(lst[i:i+l], pattern):
for j in range(i, i + l):
index.append(j)
if j != i + l - 1:
next(rng)
except StopIteration:
break
index.reverse()
for i in index:
del lst[i]
l = [1, 2, 1, 2, 1, 1, 2, 1, 3, 4, 1]
p = (1, 2, 1)
clear_list(l, p)
print l # --> [2, 1, 3, 4, 1]
Оно даже работает.
2) для генерации нового списка (все проще):
def clear2(lst, pattern):
res = []
l = len(pattern)
r = iter(xrange(len(lst)))
while True:
try:
i = next(r)
if is_equal(lst[i:i+l], pattern):
for j in range(i, i + l - 1):
next(r)
else:
res.append(lst[i])
except StopIteration:
break
return res
l = [1, 2, 1, 2, 1, 1, 2, 1, 3, 4, 1, 2]
p = (1, 2, 1)
print l
print clear2(l, p) # -> [2, 1, 3, 4, 1, 2]
Потестил на 5 примерах, оба варианта рабочии.