假设清单:
[[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函数,从来没有找到关于映射的非常有用的文章。感谢我是否可以获得一些链接。感谢!!!
答案 0 :(得分:3)
这取决于你的功能究竟是什么。
首先:如果函数说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])
,示例(读取注释):
>>> 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
现在,您想为每一行 i ∈m执行[sum(row)] + [0,] * (len(row) -1 )
表达式,然后您可以将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]
答案 1 :(得分:1)
这不是最干净的解决方案,但它向您展示了如何在列表列表中使用map
。
但是,如果要定义addPairs
方法,则必须输入list
作为输入,然后返回list
。
lst = [[2,4,0,8],[0,2,4,8],[8,0,2,4],[8,2,0,4]]
def addPairs(y):
out = []
for i in xrange(len(y)):
if i % 2 == 0:
out.append(y[i] + y[i+1])
else: out.append(0)
return out
output = map(addPairs, lst)
print output
答案 2 :(得分:1)
如果子数组固定为4个项目,那么对于输入数组中的每个项目[a, b, c, d]
,您希望输出项目[a+b, 0, c+d, 0]
使用map
,您可以使用;
map(lambda x: [x[0]+x[1], 0, x[2]+x[3], 0], input_array)
答案 3 :(得分:0)
我首先看一下this帖子。最好的答案有一些非常好的信息。
我还会看看关于lambda函数的[this]页面,因为每当我使用map时我都倾向于使用lambda ......
至于你发布的例子......
我不会为此使用映射。我绝对宁愿在这里使用列表推导
v=[[sum(i[0:2]),0,sum(i[2:]),0] for i in m]