列表列表及其索引中的最大值
Maximum value from a list of lists and its index
li = [[1,2], [2,3], [7,6]]
如何有效地找到最大值及其索引?假设 li
我想要:
max_value = 7
max_index = (2, 0)
我可以这样做:
max_value = 0
for row_idx, row in enumerate(alignment_matrix):
for col_idx, col in enumerate(row):
if col > max_value:
max_value = col
max_index = (row_idx, col_idx)
但我需要一种不使用太多不必要变量的有效方法。
用max
and generator expression,可以表达的更简洁:
max_value, max_index = max((x, (i, j))
for i, row in enumerate(li)
for j, x in enumerate(row))
但是,时间复杂度是相同的,因为这个也使用了嵌套循环。
更新
正如@jonrsharpe 指出的那样,在重复 max_value
的情况下,上述解决方案将为您提供找到该值的最大索引。
如果这不是您想要的,您可以将 key
函数参数传递给 max
以自定义行为:
max_value, max_index = max(((x, (i, j))
for i, row in enumerate(li)
for j, x in enumerate(row)),
key=lambda (x, (i, j)): (x, -i, -j))
您可以这样做:
max(data, key=lambda x: x[0])
或者,更有效的替代方法:
max(data, key=operator.itemgetter(0))
时间对比如下:
In [11]: timeit.timeit('max(data, key=lambda x: x[0])', setup='import operator, random; data=[[random.randint(1,100) for _ in range(100)] for _ in range(100)]')
Out[11]: 8.272005081176758
In [12]: timeit.timeit('max(data, key=operator.itemgetter(0))', setup='import operator, random; data=[[random.randint(1,100) for _ in range(100)] for _ in range(100)]')
Out[12]: 5.0041139125823975
li = [[1,2], [2,3], [7,6]]
如何有效地找到最大值及其索引?假设 li
我想要:
max_value = 7
max_index = (2, 0)
我可以这样做:
max_value = 0
for row_idx, row in enumerate(alignment_matrix):
for col_idx, col in enumerate(row):
if col > max_value:
max_value = col
max_index = (row_idx, col_idx)
但我需要一种不使用太多不必要变量的有效方法。
用max
and generator expression,可以表达的更简洁:
max_value, max_index = max((x, (i, j))
for i, row in enumerate(li)
for j, x in enumerate(row))
但是,时间复杂度是相同的,因为这个也使用了嵌套循环。
更新
正如@jonrsharpe 指出的那样,在重复 max_value
的情况下,上述解决方案将为您提供找到该值的最大索引。
如果这不是您想要的,您可以将 key
函数参数传递给 max
以自定义行为:
max_value, max_index = max(((x, (i, j))
for i, row in enumerate(li)
for j, x in enumerate(row)),
key=lambda (x, (i, j)): (x, -i, -j))
您可以这样做:
max(data, key=lambda x: x[0])
或者,更有效的替代方法:
max(data, key=operator.itemgetter(0))
时间对比如下:
In [11]: timeit.timeit('max(data, key=lambda x: x[0])', setup='import operator, random; data=[[random.randint(1,100) for _ in range(100)] for _ in range(100)]')
Out[11]: 8.272005081176758
In [12]: timeit.timeit('max(data, key=operator.itemgetter(0))', setup='import operator, random; data=[[random.randint(1,100) for _ in range(100)] for _ in range(100)]')
Out[12]: 5.0041139125823975