【问题标题】:How to pick the largest number in a matrix of lists in python?如何在python中的列表矩阵中选择最大的数字?
【发布时间】:2011-10-09 08:37:01
【问题描述】:

我有一个 list-of-list-of-lists,其中前两个充当“矩阵”,我可以在其中访问第三个列表

list3 = m[x][y]   

第三个列表包含字符串和数字的混合,但每个列表具有相同的大小和结构。让我们将此列表中的特定条目称为“感兴趣的数量”。此数字在此列表中始终具有相同的索引!

在 Python 中获取“兴趣”数量最多的列表的“坐标”(x,y) 的最快方法是什么?

谢谢!

(真的,我正在尝试选择 m[x][y][k] 中 k 是固定的最大数字,对于所有 x 和 y,并且“知道”它的地址是什么)

【问题讨论】:

  • 你怎么知道你对第三个列表中的哪个元素感兴趣?
  • 感兴趣的数字(或持有它们的列表)是否以任何预先存在的顺序排列?如果没有,您将获得的最快速度是 O(n^3) 和 for i in m: for j in i: for k in j:(不是确切的代码)。
  • 由于我的设置方式,我总是对同一个元素感兴趣。
  • @FooBah 无需排序即可找到最大值。

标签: python algorithm optimization


【解决方案1】:
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(n2),顺便说一句。

【讨论】:

    【解决方案2】:
    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。任何解决方案本质上都是 O(mn),但是 Python 的方法调用开销可能会很高。 Numpy 可以大大加快速度。
    【解决方案3】:

    假设“感兴趣的数量”在列表中的已知位置,并且会有一个非零最大值,

    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(n2)。由于您必须检查每个元素,因此这是最快的解决方案。

    @Marcelo 的方法更丰富,但可能不太可读。

    【讨论】:

    • 理解逻辑需要大量的句法知识。我会使用它,但如果我试图教别人如果他们不精通 python,为什么代码可以工作,则可能不会。
    • 列表推导提供了一种比传统循环方法更优越的数据操作方式。它们是我首先要教给新的 Python 程序员的概念之一。
    • 我认为@MarceloCantos 在可读性方面获胜。一方面,您真的可以使用枚举而不是手动计数。
    • 教授 Python,而不是像大多数 CS 教授那样以与语言无关的方式教授概念。同样,这显然是一个更 Pythonic 的解决方案,但入门级程序员需要先了解逻辑工作的原因,然后才能理解为什么有更好的方法来用特定语言做某事。我引导人们通过循环学习编程,有时会添加不需要说明一点的额外变量,这似乎比试图向他们解释我的单一问题更好。我想,各有各的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2015-05-17
    相关资源
    最近更新 更多