在 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])]
我是 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])]