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



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

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

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

[(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(。

相反,您应该做的是在映射中找到要映射的元素的索引(而不是在作为m元素的x中(。


方法-3(比前两个版本更好的替代方案(

比上述方法(如本答案中所建议的(更好的解决方案是使用列表枚举。因此,使用列表枚举的解决方案如下-

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的map方法要快一些。你可以在这里阅读更多关于列表枚举

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

最新更新