2016-06-27 20 views
0

您將如何實現操作,如元素明智max,min,avg,+,等等字典?兩個詞組的成員操作

舉個例子:

def max_dict(d1, d2): 
    ''' @return the maximum member value for each key 
    >>> a = {3: 4, 4: 7}; b = {3: 5, 4: 6}; max_dict(a, b) 
    {3: 5, 4: 7} 
    ''' 
    out = {} 
    for (k, v) in d1.iteritems(): 
     out[k] = max(v, d2[k]) 
    return out 

這是一個明智的辦法做到這一點?是否有一些內置函數來簡化這個? +,avg等應該同樣實施嗎?

(該tutoriallibrary reference不包含明顯的答案)

+0

這是我不清楚什麼約束 - 例如,在你的max_dict實現中,d2中的額外鍵將被忽略,儘管這在文檔中沒有指定。如果類型不對齊,你想要豁免嗎(「帽子」+3等)?我懷疑是否有內建功能來做你想做的事情,因爲這些問題的答案將是特定於案例的 –

+0

@en_Knight:上面是一個應該小心處理的示例實現。如果要在圖書館中實施,如果僅存在一個值,並且如果存在多個值,則應用操作會很酷。這應該相當於'list'的'max'等功能。 –

回答

1

這一個是推廣到http://stardict.sourceforge.net/Dictionaries.php下載任意數量的,可以應用到列表中的所有功能,並http://stardict.sourceforge.net/Dictionaries.php下載使用不同的密鑰:

def agg_dicts(func, *args): 
    keys = [] 
    for d in args: 
     keys += list(d.keys()) 
    keys = set(keys) 

    out = {} 
    for key in keys: 
     vals = [d[key] for d in args if key in d.keys()] 
     out[key] = func(vals) 

    return out 

from numpy import mean 

a = {'one':1, 'two':4, 'four':2} 
b = {'one':2, 'two':2} 
c = {'two':4, 'four':2, 'five':5} 

dict_min = agg_dicts(min, a, b, c) 
dict_max = agg_dicts(max, a, b) 
dict_avg = agg_dicts(mean, a, b, c) 
dict_sum = agg_dicts(sum, a, b, c) 

dict_max 
{'four': 2, 'one': 2, 'two': 4} 

dict_min 
{'five': 5, 'four': 2, 'one': 1, 'two': 2} 

dict_max 
{'four': 2, 'one': 2, 'two': 4} 

dict_avg 
{'five': 5.0, 'four': 2.0, 'one': 1.5, 'two': 3.3333333333333335} 

dict_sum 
{'five': 5, 'four': 4, 'one': 3, 'two': 10} 
+0

它可能將是很好的一個標誌添加適合做什麼時,一個關鍵並非在所有類型的字典也:放棄它,或者使用那些有語言,因爲代碼已經這樣做。 – Jeff

+0

那些'運行起來也()'調用是多餘的,而且他們對Python的2.還表演災難,你可以讓'keys'從一開始的一組和'union'的類型的字典進去,就像這樣: 'keys = set()。union(* args)'。 – user2357112

3

這是一個明智的辦法做到這一點?

是的。我可能會使用字典理解,但循環工作正常。

是否有一些內置函數來簡化它?

應該+avg等類似地實施?

你可以把功能應用作爲參數:

def dict_elementwise(func, d1, d2): 
    return {k: func(d1[k], d2[k]) for k in d1} 
2

像這樣:

d1 = {1:2, 3:4} 
d2 = {1:-8, 3:10} 
print {k:min(v, d2[k]) for k,v in d1.items()} 

這將使用Python的dictionary comprehension語法。

如果字典有不同的鍵:

d3 = {1:-8, 3:10} 
print {k:min(v, d3[k]) for k,v in d1.items() if k in d3} 

會發現是D1和D3的鍵相交產生的值。

所以,一般:

def map_values_for_keys(func, d1, d2): 
    """ 
    Return a dictionary of k:func(d1[k], d2[k]) for each key k 
    defined in both dictionaries d1 and d2.   
    """ 
    return {func(v, d2[k]) for k,v in d1.items() if k in d2} 

...雖然,說實話,我其實不想定義一個函數對於這種情況,因爲字典內涵是既簡單閱讀(含實踐),並明確到讀者。