2014-03-19 55 views
-1

我有一本字典:增加值

d = {'0.766': [('8.0', '-58.47'), ('192.0', '-83.41')], '0.094': [('26.0', '112.01'), ('46.0', '110.19')], '0.313': [('14.0', '75.52'), ('48.0', '77.07')]} 

而且我想在元組添加相應的值,因此輸出看起來像這樣:

key, sum of 1st values in tuple, sum of 2nd values in tuple 
0.766, 200.0, -141.88 
0.094, 72.0, 222.20 
... 

有沒有簡單的方法來做到這一點?到目前爲止,我發現總和(d.values()),但它不會做完全是我想什麼......

乾杯, 凱特

PS。現在我也想知道如何得到的輸出,如:

key, sum of 1st values in tuple, DIFFERENCE of 2nd values in tuple 
0.766, 200.0, 24.94 
0.094, 72.0, 1.82 
... 

,當我想執行兩種不同的操作...

謝謝!

回答

2
print [(k,) + tuple(sum(map(float, item)) for item in zip(*d[k])) for k in d] 
# [('0.766', 200.0, -141.88), 
# ('0.313', 62.0, 152.58999999999997), 
# ('0.094', 72.0, 222.2)] 

我們上面的內容被稱爲列表理解。實際上,它的工作原理與此類似,但在一個有效的方式

result = [] 
for k in d: 
    temp = tuple() 
    for item in zip(*d[k]): 
     temp += (sum(map(float, item)),) 
    result.append((k,) + temp) 
print result 

要處理你在編輯的問題中提到的情況下,你可以做這樣的事情

result = [] 
for k in d: 
    temp = tuple() 
    fir, sec = zip(*d[k]) 
    fir, sec = sum(map(float, fir)), reduce(lambda i,j: float(i)-float(j), sec) 
    result.append((k,) + (fir, sec)) 
print result 
+0

+1,但對於我的錢來說,列表理解是最簡單的事情。 'zip(* x)'和'sum(map(float,item))'位是集合和函數式編程,與列表理解IMO一樣難以理解。 – kojiro

+0

這個作品完美!謝謝! – kate88

+0

我現在想知道,如果我正在尋找,我們如何更改代碼,讓我們說,鍵,元組中第一個值的總和,元組中第二個值的差值? – kate88

0

我想這個答案可能是一點點直觀。它不使用「*」,這是混淆對我說:

print "\n".join(
    [ 
     "%s, %s, %s" % 
     (
      i, 
      sum([float(j[0]) for j in d[i]]), 
      sum([float(j[1]) for j in d[i]]), 
     ) 
     for i in d.keys() 
    ] 
) 

你必須將需要實際編寫循環,因爲你不是簡單地增加(或執行類似的累積操作)的列表中的後續問題數字。相反,你是從第一個減去第二個數字。由於訂單很重要,因此我上面顯示的列表理解不起作用。