假设列表:
[[2,4,0,8],[0,2,4,8],[8,0,2,4],[8,2,0,4]]
大家好,如何使用map函数处理列表行内的每个元素?
例如如果我想添加每个列表的对:
[[6,0,8,0],[2,0,12,0],[8,0,6,0],[10,0,4,0]]
基本上我不会很好地使用 map 功能,从来没有找到关于 map 的非常有用的文章。感谢我能得到一些链接。谢谢!!!
最佳答案
这取决于你的实际功能是什么。
首先:如果函数 say f
接受“list as complete row”那么你可以使用:
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)
编辑作为对评论的回应:
Actually main thing is I want to know how to manipulate the elements in rows. Which mean I can also add all the element in for e.g.
[2, 4, 0, 8]
making it into[14, 0, 0, 0]
.
首先,我怀疑你为什么要把一个列表[2, 4, 0, 8]
转换成[14, 0, 0, 0]
,why不要只输出 14
— 总和,检查您是否可以改进程序的算法/设计。
无论如何,在 Python 中我们有 sum() 函数,阅读文档 sum(iterable[, start])
, 示例(阅读评论):
>>> 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
但是如果你想像你问的那样制作一个列表,那么你可以使用 +
(列表连接)运算符和 sum 如下:
>>> row = [2, 4, 0, 8]
>>> [sum(row)] + [0,] * (len(row) -1 )
[14, 0, 0, 0]
>>>
要理解这段代码:
[sum(row)]
表示单个元素的列表,它是行的总和 —[14]
。[0,] * (len(row) -1 )
生成长度为 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]
关于Python:使用 map 函数独立处理每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23179230/