这取决于你的实际功能。
首先:如果函数说 f 接受“列表作为完整行”,那么您可以使用:
m = [[6, 0, 8, 0], [2, 0, 12, 0], [8, 0, 6, 0], [10, 0, 4, 0]]
map(f, m)
第二个:如果函数f接受每个元素,那么你需要调用嵌套的map(),如下所示:
map(lambda r: map(f, r), m)
为此,您还可以使用列表压缩:
[map(f, r) for r in m] # I prefer this
还有其他技巧,比如你可以使用functools.partial 检查这个example。
from functools import partial
newf = partial(map, f)
map(newf, m)
编辑作为对评论的回应:
实际上主要是我想知道如何操作行中的元素。这意味着我还可以添加所有元素,例如[2, 4, 0, 8] 变成[14, 0, 0, 0]。
首先,我怀疑您为什么要将列表[2, 4, 0, 8] 转换为[14, 0, 0, 0],为什么不只输出14 — 总和,检查您是否可以改进程序的算法/设计。
无论如何,在 Python 中我们有 sum() 函数,阅读文档sum(iterable[, start]),示例(阅读 cmets):
>>> row = [2,4,0,8]
>>> sum(row) # just outputs sum of all elements, in rows
14
因此,如果您想传递“列表列表”,例如m(您有问题发布),那么您可以使用map(sum, m),见下文:
>>> m = [[6, 0, 8, 0], [2, 0, 12, 0], [8, 0, 6, 0], [10, 0, 4, 0]]
>>> map(sum, m) # call sum for each row (a list) in `m`
[14, 14, 14, 14] # sum of all individual list's elements
但是如果你想按照你的要求制作一个列表,那么你可以使用+ (list concatenate) 运算符和 sum 如下:
>>> row = [2, 4, 0, 8]
>>> [sum(row)] + [0,] * (len(row) -1 )
[14, 0, 0, 0]
>>>
要理解这段代码:
-
[sum(row)] 表示作为行总和的单个元素列表 — [14]。
-
[0,] * (len(row) -1 ) 生成一个长度比行中元素数少一的零列表,请查看以下代码示例:
>>> row = [2, 4, 0, 8] # 4 elements
>>> [0,] * (len(row) -1 )
[0, 0, 0] # 3 zeros
>>>
* 运算符同样可以应用于元组,字符串也可以。
-
所以从上面开始,我制作了两个单独的列表,最后都添加了 +,如下所示:
>>> row = [2, 4, 0, 8]
>>> [sum(row)] + [0,] * (len(row) -1 )
[14, 0, 0, 0] # that is what you wants
现在,您要为每一行执行[sum(row)] + [0,] * (len(row) -1 ) 表达式i ∈ m,那么你可以使用 lambda 表达式和map() 如下:
>>> map(lambda row: [sum(row)] + [0,] * (len(row) -1 ), m)
[[14, 0, 0, 0], [14, 0, 0, 0], [14, 0, 0, 0], [14, 0, 0, 0]]
更好的是给 lambda 表达式起个名字:
>>> f = lambda r: [sum(r)] + [0,] * (len(r) -1 )
>>> f(row)
[14, 0, 0, 0]
然后使用map():
>>> map(f, m)
[[14, 0, 0, 0], [14, 0, 0, 0], [14, 0, 0, 0], [14, 0, 0, 0]]
正如我在回答的前几行中建议的那样。同样,您可以在此处使用列表压缩来代替调用 map() 为:
>>> [f(r) for r in m]