2016-01-21 2 views
0

Я пытаюсь упростить модификацию массивных словарей, которые меняют номера по многим параметрам (от датестлингов до дат питона, десятичных чисел до плавающих и т. Д.), И я хочу иметь возможность определить, нужно ли что-то менять (возможно Я только хочу, чтобы изменить некоторые цифры, а не даты):Условные выражения в dict-решениях

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

d = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5} 

def bigger_than_two(number): 
    return number > 2 

def double_it(number): 
    return number * 2 

transform_dictionary(d, double_it, bigger_than_two) 

# expecting {'one': 1, 'two': 2, 'three': 6, 'four': 8, 'five': 10} 

transform_dictionary(d, double_it) 

# expecting {'one': 2, 'two': 4, 'three': 6, 'four': 8, 'five': 10} 

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

+0

По какой-либо причине это должно быть понимание словаря? – pzp

+0

Вы делаете довольно распространенную ошибку при смешивании 'if whatever' в выражении фильтра понимания и' if whatever' в условном выражении 'x, если что-либо еще y'. То, что вы пытаетесь написать, является условным выражением, но поскольку синтаксис фильтра, специфичный для понимания, похож на одно и то же, вы пытаетесь поставить 'if whatever', куда будет идти фильтр. – user2357112

+0

Я просто подумал, что понимание будет проще всего. Я хочу иметь возможность преобразовывать значения dict, которые соответствуют критериям для огромных dicts – codyc4321

ответ

3

осознание, как это может делать то, что вы хотите

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

так из 'k:' в ' for' loop относится к тому, что делать со значением, 'v'? – codyc4321

+1

Правильно, это логика, чтобы выбрать, какое значение использовать – rtemperv

+1

Я не знаю, поблагодарить вас или питона, это чисто. Спасибо – codyc4321

1

словарь постижений с условиями принять следующую структуру:

new_dict = {key:VALUE_1 if CONDITION_1 
      else VALUE_2 if CONDITION_2 
      else VALUE_3 for key in myDict.keys()} 

вот простой пример, надеюсь, вы можете увидеть, как это работает, и измените его на в соответствии с вашим конкретным приложением.

myDict = {"a": 4, "b": 7, "c": 55, "d": 432} 
new_dict = {key:"greater than 100" if (myDict[key] > 100) 
      else "10 to 100" if myDict[key] > 10 
      else "10 or less" for key in myDict.keys()}