在Python中使用map

时间:2016-01-16 19:17:04

标签: python

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

3 个答案:

答案 0 :(得分:8)

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

float(sum) / len

会导致各种错误,因为单独评估它是没有任何意义的(除非你隐藏了sumlen,这将是一个不同的问题)。你试图总结一个内置函数然后除以另一个!因此它不能成为一个论点。

相反,做一个函数,例如:

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