2016-01-25 1 views
3

У меня была сломанная функция, которая должна либо сжимать все элементы через функцию, либо только запускать элементы, которые передают True из квалификационной функции, если задана квалифицируемая функцияс использованием определения dict, если логика/else для определения с помощью функции или нет

def transform_dictionary(dictionary, callback, qualification_callback=None): 
    return {k: callback(v) if qualification_callback and qualification_callback(v) else v for k, v in dictionary.items()} 

Он был сломан, потому что ему потребовалась вторая функция для преобразования. У меня теперь есть

def transform_dictionary(dictionary, callback, qualification_callback=None): 
    if qualification_callback: 
     return {k: callback(v) if qualification_callback(v) else v for k, v in dictionary.items()} 
    else: 
     return {k: callback(v) for k, v in dictionary.items()} 

, который является уродливым, но работает. Могу ли я сделать это в одной строке, где я либо запускаю все значения через обратный вызов, либо сначала проверяю правду во втором обратном вызове, а только запускаю все, что проходит? Спасибо

ответ

4

Вы можете использовать постоянную функцию в качестве значения по умолчанию вместо None:

def transform_dictionary(dictionary, callback, qc=lambda x: True): 
    return {k: callback(v) if qc(v) else v for k, v in dictionary.items()} 
+0

о, так дс всегда возвращает истину , и он всегда работает, но по умолчанию он просто игнорируется. очень pythony, ty – codyc4321

6

v возвращается только если есть квалификация обратного вызова и возвращает значение False для заданного значения, так что мы можем проверить это условие и либо вернуть v, если оба условия выполняются, либо вернуть callback(v).

def transform_dictionary(dictionary, callback, qualification_callback=None): 
    return {k: v if qualification_callback and not qualification_callback(v) else callback(v) 
      for k, v in dictionary.items()} 
+1

Я думаю, что вы хотите '{к: В, если ...}' – birryree