【问题标题】:In python map: use lambda function to adds the row number to each row of a matrix在python map中:使用lambda函数将行号添加到矩阵的每一行
【发布时间】:2020-07-15 19:06:18
【问题描述】:

我是 python map 和 reduce 框架的新手。假设我有以下矩阵:

m = [[1,2,3],[5,6,7],[9,10,11]]

我想使用带有 lambda 函数的 map 函数来创建一对在前面有行索引的每一行。所需的输出如下:

[(0, [1, 2, 3]),
 (1, [5, 6, 7]),
(2, [9, 10, 11])]

我尝试了以下但我不知道如何迭代行索引。我知道我应该将 x[0] 中的 0 替换为其他内容,但我不知道是什么。

map(lambda x: (x.index(x[0]), x) ,m) 

# [(0, [1, 2, 3]), (0, [5, 6, 7]), (0, [9, 10, 11])]

【问题讨论】:

    标签: python mapreduce data-manipulation


    【解决方案1】:

    使用枚举的简单列表推导

    l = [[1,2,3],[5,6,7],[9,10,11]]
    print([(r, row) for r,row in enumerate(l)])
    print(list(map(lambda x: (x), enumerate(l))))
    

    输出

    [(0, [1, 2, 3]), (1, [5, 6, 7]), (2, [9, 10, 11])]
    [(0, [1, 2, 3]), (1, [5, 6, 7]), (2, [9, 10, 11])]
    

    【讨论】:

      【解决方案2】:

      您试图获取同一元素 (x) 中每个元素 (x[0]) 的第一个值的索引:x.index(x[0])。所以你可以把它改成m.index(x):

      m = [[1,2,3],[5,6,7],[9,10,11]]
      
      print(list(map(lambda x: (m.index(x), x) ,m) ))
      

      输出:

      [(0, [1, 2, 3]), (1, [5, 6, 7]), (2, [9, 10, 11])]
      

      【讨论】:

        【解决方案3】:

        您确实可以使用二维列表m 上的枚举获得所需的输出。然后,您需要通过将地图对象转换为列表将其分配回m。你可以这样做 -

        方法 - 1

        m = [[1,2,3],[5,6,7],[9,10,11]]
        
        m=list(map(lambda x: (x[0],x[1]), enumerate(m)))
        print(m)
        

        输出:

        [(0, [1, 2, 3]), (1, [5, 6, 7]), (2, [9, 10, 11])]
        

        方法 - 2

        另一种可能的方法如下 -

        m = [[1,2,3],[5,6,7],[9,10,11]]
        
        m=list(map(lambda x: (m.index(x),x), m)) 
        # finding index in m using m.index(x) instead of x.index(x[0]) which would always return 0
        print(m)
        

        输出:

        [(0, [1, 2, 3]), (1, [5, 6, 7]), (2, [9, 10, 11])]
        

        您试图对(x.index(x[0]) 执行的操作会在原始二维列表的元素中找到始终为您提供 0 的元素(因为您在列表中找到显然会给出 0 的第 0 个索引元素) .

        你应该做的是找到你在地图中映射的元素的索引(而不是在 x 中,它是 m 的元素)。


        APPROACH - 3(比前两个版本更好的选择)

        比上述方法更好的解决方案(如answer 中所建议的那样)是使用列表枚举。所以,使用列表枚举的解决方案如下 -

        m = [[1,2,3],[5,6,7],[9,10,11]]
        
        m=[(index,element) for index,element in enumerate(m)]
        print(m)
        

        输出:

        [(0, [1, 2, 3]), (1, [5, 6, 7]), (2, [9, 10, 11])]
        

        事实证明,这种方法比使用带有 lambda 方法的地图要快一些。您可以阅读有关列表枚举的更多信息here

        方法 - 4(单线)

        由于enumerate() 返回一个包含索引和元素本身的枚举对象,因此可以将方法3 修改为更短更简单的版本,如下所示 -

        m = [[1,2,3],[5,6,7],[9,10,11]]
        print(list(enumerate(m)))
        

        输出:

        [(0, [1, 2, 3]), (1, [5, 6, 7]), (2, [9, 10, 11])]
        

        【讨论】:

        • 嘿@Abhishek,您的第二个解决方案实际上是我的答案。 :/ 请删除或编辑它以提供不同的解决方案。
        • 我先发帖,所以请编辑你的答案。如果你对我的回答投了反对票(只是猜测),也许你能解释一下原因。 @Abhishek
        • 感谢编辑。现在,您的第二个解决方案实际上是@Rob Raymond 的解决方案:/
        • 当然,一旦我们得到不同的解决方案,我们就可以互相投票,因为没有相似的方法,有相同的解决方案,也许有不同的解释,但它仍然是相同的解决方案。
        • 您有两个与第一个答案不同的选项,为什么不留下这两个并解决问题? @Abhishek
        猜你喜欢
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 2013-02-23
        • 2020-03-19
        • 1970-01-01
        • 2016-03-04
        相关资源
        最近更新 更多