我正在尝试使用map
Python函数(我知道我可以使用列表推导但我被指示在此示例中使用map)来获取两行矩阵的行平均值。
以下是我认为答案应该是这样的:
def average_rows2(mat):
print( map( float(sum) / len , [mat[0],mat[1]] ) )
average_rows2([[4, 5, 2, 8], [3, 9, 6, 7]])
现在,只有sum函数有效:
def average_rows2(mat):
print( map( sum , [mat[0],mat[1]] ) )
average_rows2([[4, 5, 2, 8], [3, 9, 6, 7]])
第一个问题是将float()
添加到sum函数会产生错误:
TypeError: float() argument must be a string or a number
这很奇怪,因为结果列表的元素应该是整数,因为它成功地计算了总和。
此外,将/ len
添加到sum函数会出现此错误:
TypeError: unsupported operand type(s) for /: 'builtin_function_or_method' and 'builtin_function_or_method'
对于此错误,我尝试了*
和//
,并且说没有支持操作数类型。我不明白为什么这些都不会得到支持。
也许这意味着map
函数不采用复合函数?
答案 0 :(得分:8)
必须先评估第一个参数,然后才能将其传递给map
。这样:
float(sum) / len
会导致各种错误,因为单独评估它是没有任何意义的(除非你隐藏了sum
和len
,这将是一个不同的问题)。你试图总结一个内置函数然后除以另一个!因此它不能成为一个论点。
相反,做一个函数,例如:
lambda lst: float(sum(lst)) / len(lst)
这是一个带有单个参数的可调用对象,因此可以用作map
的第一个参数,然后将其应用于第二个参数中的每个元素。您也可以使用常规函数,而不是匿名lambda
(如https://stackoverflow.com/a/34831192/3001761中所示)。
答案 1 :(得分:0)
无论有多少行,这都会有效:
def average_rows(m):
return map(lambda l: sum(l) / float(len(l)), m)
print average_rows([[4, 5, 2, 8], [3, 9, 6, 7]]) # [4.75, 6.25]
该函数返回一个列表,该列表是将lambda应用于m
的每个元素(行)的结果。
lambda expression lambda l: sum(l) / float(len(l))
基本上是一个函数,它接受一个列表并将其元素的平均值作为float返回。您可以将其分配给变量并将其称为常规函数:
avg = lambda l: sum(l) / float(len(l))
print avg([1, 2, 3])
答案 2 :(得分:0)
map
所做的是将给定函数应用于列表的每个元素。在你的情况下,我认为分别定义这个函数(计算单行的平均值)比较清楚,如下:
def average_of_one_row(r):
return float(sum(r)) / len(r)
def average_of_each_row(mat):
return map(average_of_one_row, mat)
print average_of_rows([[4, 5, 2, 8], [3, 9, 6, 7]])