下面是如何使用 max() 的嵌套列表推导:
d = [[1, 2, 3],
[4, 5, 6]]
def find_peak_2d(arr):
result = max([max([(j, i, v) for i, v in enumerate(w)], key=lambda x:x[2]) for j, w in enumerate(arr)], key=lambda x:x[2])[:-1]
return result
print(find_peak_2d(d))
输出:
(1, 2)
让我们分解这部分:
max([max([(j, i, v) for i, v in enumerate(w)], key=lambda x:x[2]) for j, w in enumerate(arr)], key=lambda x:x[1])
首先,让我们只有:
max([max(r) for r in arr])
这将在数组中找到最大的数字,但不是它的索引。
要找到最大数的索引,我们需要使用enumerate 来遍历数组,同时跟踪索引:
max([max([(i, v) for i, v in enumerate(r)]) for r in arr])
如您所见,内部列表推导式现在保留每个数字的索引和值。
但是现在我们需要告诉python如何确定该列表的max,因为我们不希望python简单地找到max索引!
为此,我们可以使用带有lambda 函数lambda x: x[1] 的键,因此python 将知道仅比较每个元组的第二个索引以找到max。
max([max([(i, v) for i, v in enumerate(r)], key=lambda x:x[1]) for r in arr])
现在我们有了列的索引,是时候找到行的索引了。基本上是一样的,我们用enumerate,还有一个功能为lambda x: x[1]的key:
max([max([(i, v) for i, v in enumerate(w)], key=lambda x:x[1]) for j, w in enumerate(arr)], key=lambda x:x[1])
现在,行的索引将会丢失,因为我们没有在整个迭代过程中将它存储在任何地方。为了解决这个问题,
在此处添加索引:(i, v) 到 (j, i, v):
max([max([(j, i, v) for i, v in enumerate(w)], key=lambda x:x[1]) for j, w in enumerate(arr)], key=lambda x:x[1])
我们现在需要将两个max 的键更改为lambda x:x[2],因为元组的值现在位于第三个索引中。
最后,我们使用[:-1]的切片省略了结果的值:
max([max([(j, i, v) for i, v in enumerate(w)], key=lambda x:x[2]) for j, w in enumerate(arr)], key=lambda x:x[2])[:-1]