2012-01-05 3 views
3

Я пытаюсь написать понимание списка кортежей с использованием операторов в python 2.7, tkinter. Альфа - это исходные данные, бета результат.Вложенные операторы

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)] 

продукты/суммарная продукция?

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] 

 Смежные вопросы

  • Нет связанных вопросов^_^