Python:使用map函数独立处理每一行

时间:2014-04-20 06:32:55

标签: python list map row element

假设清单:

[[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函数,从来没有找到关于映射的非常有用的文章。感谢我是否可以获得一些链接。感谢!!!

4 个答案:

答案 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]
>>> 

要理解这段代码:

  1. [sum(row)]表示作为行总和的单个元素的列表 - [14]
  2. [0,] * (len(row) -1 )生成一个长度为零的零列表,然后列入行中的元素数量,请查看下面的代码示例:

     >>> row =  [2, 4, 0, 8]   # 4 elements 
     >>> [0,] * (len(row) -1 )
     [0, 0, 0] # 3 zeros
     >>> 
    

    *运算符同样可以应用于元组,字符串。

  3. 从上面开始,我制作了两个单独的列表并最终添加+,如下所示:

    >>> row =  [2, 4, 0, 8] 
    >>> [sum(row)] + [0,] * (len(row) -1 )
    [14, 0, 0, 0]  # that is what you wants 
    
  4. 现在,您想为每一行 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]