2011-10-09 97 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可以通过一个很重要的因素加快速度。 –