2014-09-24 55 views
2

我有三個詞典有相似的鍵,其價值我想做一些計算。計算表達式的三個詞典的值具有相似的鍵

dict1 = {key1: 1, key2: 2, key3: 3} 
dict2 = {key1: 10, key2: 10, key3: 10} 
dict2 = {key1: 1, key2: 2, key3: 3} 

如何使用Python來找到結果的詞典:

dict1.values()/((dict2.values() - dict3.values())*100) 

我正在尋找的結果,像這樣:

resultdict = {key1: .00111111, key2: .0025, key3: .00428571} 

我已經成功地做到了用以下方式計算兩個字典,但我很困惑如何包含第三個:

finaldict = {} 
for key in (dict1.viewkeys() | dict2.viewkeys()): 
    if key in dict1: finaldict.setdefault(key, []).append(dict1[key][0]) 
    if key in dict2: finaldict.setdefault(key, []).append(dict2[key]) 
for lst in finaldict.values(): 
    if not lst[0] == 0: 
     lst[0] = (float(lst[1])/float(lst[0]))*100 
     del lst[-1] 

回答

2

假設鍵在dict1都一樣dict2dict3的鑰匙,這應該是一個簡單的解決方案如下:

dict1 = {'key1': 1, 'key2': 2, 'key3': 3} 
dict2 = {'key1': 10.4, 'key2': 10, 'key3': 10} 
dict3 = {'key1': 10.4, 'key2': 2, 'key3': 3} 

finaldict = {} 
for key in dict1.keys(): 
    denom = float(dict2[key]) - float(dict3[key]) 
    if denom == 0.0: # or denom <= 0.0 
     continue # skips over 'key1' because it can't do division by 0 
    finaldict[key] = dict1[key]/(denom * 100) 

print finaldict 
# {'key3': 0.004285714285714286, 'key2': 0.0025} 
+0

如果分母不爲零,確保這隻會運行的好方法 – user25976 2014-09-24 23:44:53

+1

爲該 – sheeptest 2014-09-25 14:33:42

3

這是很容易想到,如果你使用的字典的理解,這樣的:

finaldict = { k: float(dict1[k])/((dict2[k]-dict3[k])*100) for k in dict1} 

=的右手邊的表達式是一個字典的理解。它創建一個詞典並填充循環的結果。在我們的例子中,我們循環所有的鍵for k in dict。關鍵字:值對根據您的公式計算得出:k: dict1/dict2...

完整的程序:

key1, key2, key3 = 'key1', 'key2', 'key3' 
dict1 = {key1: 1, key2: 2, key3: 3} 
dict2 = {key1: 10, key2: 10, key3: 10} 
dict3 = {key1: 1, key2: 2, key3: 3} 
finaldict = { k: float(dict1[k])/((dict2[k]-dict3[k])*100) for k in dict1} 
print finaldict 

或者,如果您擔心的密鑰列表可能會有所不同,使用的主要觀點交集(&)。這將產生一個set,其中只列出了共同的鍵。

key1, key2, key3 = 'key1', 'key2', 'key3' 
dict1 = {'extra': 42, key1: 1, key2: 2, key3: 3} 
dict2 = {key1: 10, key2: 10, key3: 10} 
dict3 = {key1: 1, key2: 2, key3: 3} 

keys = dict1.viewkeys() & dict2.viewkeys() & dict3.viewkeys() 
finaldict = { k:float(dict1[k])/((dict2[k]-dict3[k])*100) for k in keys } 
print finaldict 

當然,有時一個理解的單一表達是不夠的。您可以隨時切換回一個循環:

key1, key2, key3 = 'key1', 'key2', 'key3' 
# Note: dict2[key3]==dict3[key3], which will cause a divide-by-zero error. 
dict1 = {'extra': 42, key1: 1, key2: 2, key3: 3} 
dict2 = {key1: 10, key2: 10, key3: 3} 
dict3 = {key1: 1, key2: 2, key3: 3} 

finaldict = {} 
for k in dict1.viewkeys() & dict2.viewkeys() & dict3.viewkeys(): 
    try: 
     finaldict[k] = float(dict1[k])/((dict2[k]-dict3[k])*100) 
    except ZeroDivisionError: 
     pass # Skip divide-by-zero errors! 
print finaldict 
+0

德勤。我學到了東西。 – sheeptest 2014-09-24 01:33:22

+0

線key1,key2,key3 ='key1','key2','key3'的重要性是什麼?在分母爲0的情況下,如何避免錯誤?我感謝你的迴應。 – user25976 2014-09-24 23:05:37

+0

@Rob我忘了在我之前的問題中標記你 – user25976 2014-09-24 23:18:56

1

搶了已經提到如何找到價值,但是你需要的另一件事是如何獲得常見的關鍵。您可以嘗試以下技術:

In [240]: allK = map(set, map(lambda m: m.keys(), dicts)) 

In [241]: allK 
Out[241]: [{'key1', 'key2', 'key3'}, {'key1', 'key2', 'key3'}, {'key1', 'key2', 'key3'}] 

In [242]: reduce(lambda m, n: m&n, allK ) 
Out[242]: {'key1', 'key2', 'key3'} 

然後,使用這些鍵代替dict1中的鍵,如Rob所述。

編輯:

忘了提,

dicts = [dict1, dict2, dict3] 

你需要做到這一點。如果你感覺使用詞典的一個相當大的數量特別懶,他們在你所描述的方式整齊編號,你可以隨時欺騙:

In [247]: eval('[' + ', '.join([ 'dict%d'%i for i in range(1,4)]) + ']') 
Out[247]: 
[{'key1': 1, 'key2': 2, 'key3': 3}, 
{'key1': 10, 'key2': 10, 'key3': 10}, 
{'key1': 1, 'key2': 2, 'key3': 3}] 
+0

添加了邏輯或者'set.intersection(*(set(d.keys())for d in dicts ))'。 – 2014-09-24 01:46:55

+0

就地擴展與列表理解。這很整齊,謝謝! – ssm 2014-09-24 01:49:56

相關問題