在 python 映射中:使用 lambda 函数将行号添加到矩阵的每一行

In python map: use lambda function to adds the row number to each row of a matrix

我是 python 映射和缩减框架的新手。假设我有以下矩阵:

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

使用枚举的简单列表理解

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

您试图获取同一元素 (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])]

您确实在二维列表 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() returns 包含索引和元素本身的枚举对象,方法 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])]