Применить функцию к части списка Python - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу написать функцию с именем compress, которая принимает список, два индекса и функцию и выплевывает один и тот же список с двумя элементами, указанными как «сжатые» вместе с данной функцией. Я реализовал это с помощью copy.deepcopy следующим образом:

import copy
def compress(l, i, j, f):
   r = copy.deepcopy(l)
   r[i] = f(r[i], r[j])
   r.pop(j)
   return r

Есть ли более питонный способ сделать это? Или, может быть, более «чистый» функциональный способ?

1 Ответ

0 голосов
/ 14 сентября 2018

Функциональным способом было бы перестроить новый список вместо того, чтобы изменять.Чтобы упростить ситуацию, ее можно записать в виде функции генератора, с помощью простой утилиты-оболочки, создающей список из генератора:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...