【问题标题】:Python: Processing each row independently using map functionPython:使用 map 函数独立处理每一行
【发布时间】:2014-04-20 06:32:54
【问题描述】:

假设列表:

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

基本上我不会很好地使用地图功能,从来没有找到非常有用的关于地图的文章。感谢我能得到一些链接。谢谢!!!

【问题讨论】:

  • “我想添加每个列表的对”——究竟是什么意思?能给我举个例子吗。你如何结对?
  • 实际上主要是我想知道如何操作行中的元素。这意味着我还可以添加所有元素,例如[2,4,0,8] 变成 [14,0,0,0]。

标签: python list map row element


【解决方案1】:

这取决于你的实际功能。

首先:如果函数说 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]
>>> 

要理解这段代码:

  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 
    

现在,您要为每一行执行[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]

【讨论】:

【解决方案2】:

这不是最干净的解决方案,但它向您展示了如何在列表列表中使用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

【讨论】:

    【解决方案3】:

    如果子数组固定为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)
    

    【讨论】:

    • 这似乎非常限制。如果每个列表中有 1000 个元素会怎样。
    • @sshashank124 那么是的,你会使用另一种方法。这主要是作为一个非常简单的示例,将一个简单的值映射到另一个以显示映射的工作原理。
    • 先生,为什么要在我的问题中删除您的答案
    【解决方案4】:

    我会先查看this 的帖子。那里的最佳答案有一些非常好的信息。

    我还会查看关于 lambda 函数的 [this] 页面,因为每当我使用 map 时,我也倾向于使用 lambda...

    至于您发布的示例...

    我不会为此使用映射。我认为我肯定更喜欢在这里使用列表推导

    v=[[sum(i[0:2]),0,sum(i[2:]),0] for i in m]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多