2012-01-05 34 views
3

我想在Python 2.7,tkinter中使用運算符來編寫元組列表的理解。 Alpha是原始數據,測試結果。嵌套的運營商

alpha=[(A,1,1,2), 
(B,2,2,2), 
(C,3,1,2)] 

產品

beta=[(alpha[0],"%.2f"% reduce(mul,alpha[1:])) for alpha in alpha] 
beta 
[(A,2.00),(B,8.00),(C,6.00)] 

總和

beta=[(alpha[0],"%.2f"% reduce(add,alpha[1:])) for alpha in alpha] 
beta 
[(A,4.00),(B,6.00),(C,6.00)] 

但是,當我嘗試將這些結合起來,嵌套操作,我難倒。我如何獲得產品總和的

beta 
[(A,16.00),(B,16.00),(C,16.00)] 

products/sum of products?

beta 
[(A,0.13),(B,0.44),(C,0.38)] 

我試過以下的各種迭代沒有成功

beta=[(alpha[0],"%.2f"% reduce(add, map(mul,alpha[1:])) for alpha in alpha] 

回答

1

下面是做到這一點的一種方法:

In [46]: alpha=[('A',1,1,2),('B',2,2,2),('C',3,1,2)] 

In [49]: total = float(sum(reduce(mul,a[1:]) for a in alpha)) 

In [50]: total 
Out[50]: 16.0 

In [51]: [(a[0], "%.2f" % (reduce(mul,a[1:])/total)) for a in alpha] 
Out[51]: [('A', '0.12'), ('B', '0.50'), ('C', '0.38')] 

我假設0.44是一個錯字。如果不是,請說明應如何計算。

0

你可以使用匿名函數與減少:

sum_of_products = [(x[0], float(reduce(lambda y,z: y+z*z, x[1:],0))) for x in alpha]