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

标签 python list dictionary 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 功能,从来没有找到关于 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]
>>> 

要理解这段代码:

  1. [sum(row)] 表示单个元素的列表,它是行的总和 — [14]
  2. [0,] * (len(row) -1 ) 生成长度为 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]

关于Python:使用 map 函数独立处理每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23179230/

相关文章:

python - 委托(delegate)给异步子生成器

python - 在 Twisted 中写入文件(阻塞 IO 操作)的更好方法

python - 处理 3D 体素数据的最佳方法是什么?

python - 字典列表想要获取每个值并将它们放入单独的列表中?

java - 在 Java 中使用就地集合初始化器的缺点是什么

python - 尝试使用 uWSGI 部署 python Pyramid 应用程序

python - 用随机数替换条件下的numpy数组值

python - 创建子列表

c# - LINQ:如何将内部列表中的项目放入一个列表中?

python - 在 Pandas Dataframe 中查找多个字典键并返回多个匹配值