2011-10-09 112 views
1

我有一個列表的列表 - - 列表,其中前兩個充當「黑客帝國」,在那裏我可以進入第三列表作爲如何挑選Python中列表矩陣中的最大數字?

list3 = m[x][y] 

和第三列表包含字符串的混合和數字,但每個列表具有相同的大小&結構。讓我們在這個列表中調用一個特定的條目。這個數字在這個列表中總是有相同的索引!

什麼是最快的獲取「座標」(x,y)的列表,其中Python的興趣數量最多的列表是「座標」(x,y)?

謝謝!

(所以真的,我想挑米數量最多[X] [Y] [K]其中k是固定的,對於所有的x & y和 '知道' 它的地址是什麼)

+1

你怎麼知道你感興趣的第三個列表中的元素? –

+0

感興趣的nunbers(或名單持有他們)在任何預先存在的秩序?如果不是的話,你得到的最快速度是O(n^3),其中'for i in m:for j in i:for k in j:'(not exact code)。 –

+0

我總是對同樣的元素感興趣,因爲我設置它的方式。 – Deniz

回答

4
max((cell[k], x, y) 
    for (y, row) in enumerate(m) 
    for (x, cell) in enumerate(row))[1:] 

此外,您還可以將結果直接分配給幾個變量:

(_, x, y) = max((cell[k], x, y) 
       for (y, row) in enumerate(m) 
       for (x, cell) in enumerate(row)) 

這是O(ñ ),順便說一句。

0

假設「興趣的數量」是在列表中的一個已知的點,並且將有一個非零最大值,

maxCoords = [-1, -1] 
maxNumOfInterest = -1 
rowIndex = 0 
for row in m: 
    colIndex = 0 
    for entry in row: 
     if entry[indexOfNum] > maxNumOfInterest: 
      maxNumOfInterest = entry[indexOfNum] 
      maxCoords = [rowIndex,colIndex] 
     colIndex += 1 
    rowIndex += 1 

是一種幼稚方法,該方法將是爲O(n )上矩陣的大小。由於您必須檢查每個元素,這是可能的最快解決方案。

@馬塞洛的方法更加多汁,但可讀性較差。

+0

可讀性較差? –

+0

需要大量的語法知識來理解邏輯。我會使用它,但如果我試圖教某人爲什麼代碼能工作,如果他們不熟悉python,可能不會。 – brc

+1

列表推斷提供了一種比傳統循環方法更好地考慮數據操作的方式。他們是我會教一個新的Python程序員的第一個概念之一。 –

3
import itertools 

indexes = itertools.product(xrange(len(m)), xrange(len(m[0])) 
print max(indexes, key = lambda x: m[x[0]][x[1]][k]) 

或使用numpy的

import numpy 
data = numpy.array(m) 
print numpy.argmax(m[:,:,k]) 

在你有興趣在Python加快行動,你真的需要看看numpy的。

+1

+1。任何解決方案本質上都是O(mn),但是在Python的方法調用開銷下,常數因子可能很高。 Numpy可以通過一個很重要的因素加快速度。 –