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