簡體   English   中英

列表及其索引列表中的最大值

[英]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)

但是我需要一種有效的方法而不使用太多不必要的變量。

使用maxgenerator表達式 ,您可以更快地表達它:

max_value, max_index = max((x, (i, j))
                           for i, row in enumerate(li)
                           for j, x in enumerate(row))

但是,時間復雜度是相同的,因為這個也使用嵌套循環。

UPDATE

正如@jonrsharpe所指出的,在重復max_value s的情況下,上面的解決方案將為您提供找到值的最大索引。

如果這不是您想要的,您可以將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM