这是之前问题的一个分支,开始滚雪球。如果我有一个矩阵A并且我想使用每行[1:]值的平均值/平均值来创建另一个矩阵B,但保持行标题不变,我该怎么做?我已经包含了矩阵A,我试图将列表理解拼凑在一起,以及预期的结果。
from operator import sum,len
# matrix A with row headings and values
A = [('Apple',0.95,0.99,0.89,0.87,0.93),
('Bear',0.33,0.25.0.85,0.44,0.33),
('Crab',0.55,0.55,0.10,0.43,0.22)]
#List Comprehension
B = [(A[0],sum,A[1:]/len,A[1:]) for A in A]
预期结果
B = [('Apple', 0.926), ('Bear', 0.44), ('Crab', 0.37)]
答案 0 :(得分:5)
你的列表理解看起来有点奇怪。您对iterable和item使用相同的变量。
这种方法似乎有效:
def average(lst):
return sum(lst) / len(lst)
B = [(a[0], average(a[1:])) for a in A]
为了便于阅读,我创建了一个函数average
。它符合您的预期值,所以我认为这就是您想要的,尽管您使用mul
表示我可能遗漏了某些内容。
答案 1 :(得分:1)
来自@recursive和@Steven Rumbalski:
>>> def average(lst):
... return sum(lst) / len(lst)
...
>>> A = {
... 'Apple': (0.95, 0.99, 0.89, 0.87, 0.93),
... 'Bear': (0.33, 0.25, 0.85, 0.44, 0.33),
... 'Crab': (0.55, 0.55, 0.10, 0.43, 0.22),
... }
>>>
>>> B = [{key: average(values)} for key, values in A.iteritems()]
>>> B
[{'Apple': 0.92599999999999993}, {'Bear': 0.44000000000000006}, {'Crab': 0.37}]