2013-06-24 97 views
1

我正在努力與python字典。我創建了一個字典,看起來像:從python字典中獲取值

d = {'0.500': ['18.4 0.5', '17.9 0.4', '16.9 0.4', '18.6 0.4'], 
    '1.000': ['14.8 0.5', '14.9 0.5', '15.6 0.4', '15.9 0.3'], 
    '0.000': ['23.2 0.5', '23.2 0.8', '23.2 0.7', '23.2 0.1']} 

和我想結束有:

0.500 17.95 0.425 

這是關鍵,平均的(18.4 + 17.9 + 16.9 + 18.6),平均的(0.5 + 0.4 + 0.4 + 0.4)

(與同爲1.000和0.000與其對應的平均值)

最初我的字典裏只有兩個值,所以我可以依靠指標:

for key in d: 
    dvdl1 = d[key][0].split(" ")[0] 
    dvdl2 = d[key][1].split(" ")[0] 

    average = ((float(dvdl1)+float(dvdl2))/2) 

,但現在我想有不同的字典長度我的代碼工作與讓說,4(上面的例子中)或5或6個的每個值...

乾杯!

回答

5
for k,v in d.iteritems(): 
    col1, col2 = zip(*[map(float,x.split()) for x in v]) 
    print k, sum(col1)/len(v), sum(col2)/len(v) 
...  
0.500 17.95 0.425 
1.000 15.3 0.425 
0.000 23.2 0.525 

如何工作的:

>>> v = ['18.4 0.5', '17.9 0.4', '16.9 0.4', '18.6 0.4'] 

第一分割每個項目在白色空間和應用float給他們,所以我們得到名單的名單:

>>> zipp = [map(float,x.split()) for x in v] 
>>> zipp 
[[18.4, 0.5], [17.9, 0.4], [16.9, 0.4], [18.6, 0.4]] #list of rows 

現在我們可以使用zip*,它起解壓作用,我們將得到一列列表。

>>> zip(*zipp) 
[(18.4, 17.9, 16.9, 18.6), (0.5, 0.4, 0.4, 0.4)] 
+1

+1使用'zip'創建列的不錯和簡潔。 – HennyH

+0

+1;你也可以在v))中使用'col1,col2 = zip(*(map(float,x.split()),避免用這種方式構建中間列表。 –

+0

這個工作真的很好!謝謝你的解釋! – kate88