2012-01-05 30 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]