在Python中使用map

在Python中使用map,python,Python,我试图使用mapPython函数(我知道我可以使用列表理解,但在本例中我被指示使用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(

我试图使用
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
函数不采用复合函数?

必须先计算第一个参数,然后才能将其传递给
map
。这:

float(sum) / len
会导致您出现各种错误,因为单独对其进行评估没有任何意义(除非您对
sum
len
进行了跟踪,这将是另一个问题)。您试图对一个内置函数求和,然后除以另一个!因此,这不能成为一个论点

相反,创建一个函数,例如:

lambda lst: float(sum(lst)) / len(lst)

这是一个带有单个参数的可调用函数,因此可以用作
map
的第一个参数,然后将其应用于第二个参数中的每个元素。您还可以使用常规函数,而不是匿名
lambda
(如中所示)

无论有多少行,这都将起作用:

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 l:sum(l)/float(len(l))基本上是一个函数,它接受一个列表并将其元素的平均值作为float返回。您可以将其分配给变量,并像调用常规函数一样调用它:

avg = lambda l: sum(l) / float(len(l))
print avg([1, 2, 3])

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