Я бы не назвал это намного лучше, но это другой способ сделать это, и он также обрабатывает причуду, на которую указывает Джастин. (Меня больше интересовало нахождение подпоследовательности в списке, и я не смог найти хорошую функцию в Google)
def findsubseq(L, subseq):
if not subseq: return # just die on zero-len input
i = -1
try:
while True:
i = L.index(subseq[0], i+1)
for j in range(1, len(subseq)):
if L[i+j] != subseq[j]:
break
else:
yield i
except ValueError: pass
except IndexError: pass
def replace(target, changethis, tothis):
subseqs = [x for x in findsubseq(target, changethis)]
subseqs.reverse()
for i in subseqs:
target[i:i+len(changethis)] = tothis
def collapse():
global s
replace(s, ['foo', 'bar'], ['baz'])
def expand():
global s
replace(s, ['baz'], ['foo', 'bar'])
s = ['foo', 'bar', 'wtf', 'foo', 'bar', 'wtf',
'foo', 'bar', 'bar', 'bar', 'foo']
print s
collapse()
print s
expand()
print s
C:\Scripts>subseq.py
['foo', 'bar', 'wtf', 'foo', 'bar', 'wtf', 'foo', 'bar', 'bar', 'bar', 'foo']
['baz', 'wtf', 'baz', 'wtf', 'baz', 'bar', 'bar', 'foo']
['foo', 'bar', 'wtf', 'foo', 'bar', 'wtf', 'foo', 'bar', 'bar', 'bar', 'foo']
Редактировать : обобщено это просто функция замены