Функциональным способом было бы перестроить новый список вместо того, чтобы изменять.Чтобы упростить ситуацию, ее можно записать в виде функции генератора, с помощью простой утилиты-оболочки, создающей список из генератора:
def itercompress(source, first_index, second_index, compress_func):
compressed = compress_func(source[first_index], source[second_index])
for index, value in enumerate(source):
if index == first_index:
yield compressed
elif index == second_index:
continue
else:
yield value
def compress(source, first_index, second_index, compress_func):
return list(itercompress(source, first_index, second_index, compress_func)
Не уверен, что это даст лучшие результаты, хотя ... За исключением, вероятно, бесполезногоdeepcopy
(хорошо, зависит, если функция сжатия делает неприятные вещи со своими аргументами, но тогда я бы сказала, что это ошибка программирования от автора функции сжатия), вашему коду просто не хватает правильного именования, чтобы быть pythonic ("pythonic" неозначает «причудливый», ни «умный», ни даже «элегантный», но «правильный», «простой» и «читаемый»):
def compress(source, first_index, second_index, compress_func):
result = source[:] # shallow copy
result[first_index] = compress_func(result[first_index], result[last_index])
result.pop(last_index)
return result