2016-01-21 67 views
0

我想簡化修改巨大的詞典周圍很多變化(從日期字符到蟒蛇日期,小數到浮動等),並且我想要能夠確定是否需要更改某些東西我只是想改變一些數字,而不是日期):在詞典理解條件

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 if和if條件表達式中的if if混合在一起。你試圖編寫的是一個條件表達式,但是因爲理解特定的過濾器語法看起來像是一樣的東西,所以你試圖在過濾器所在的位置放置if if。 – user2357112

+0

我只是覺得理解最簡單。我希望能夠轉換符合大字典標準的字典值 – 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'循環指的是對值「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()}