搜索最小值

时间:2017-05-17 15:24:31

标签: python arrays list initialization

假设我有一个名为list的{​​{1}},其中包含以下值:

positions

该列表基本上是(X | Y)坐标的列表。 现在我想得到这个列表中最小的X坐标和最小的Y坐标。

我目前正在使用以下代码:

positions = [
    [148, 23],
    [31, 89 ],
    [102, 89],
    [60, 100],
    [46, 41 ]
]

您可能已经注意到,我现在使用minX = minY = 1000000 for point in position: if point[0] < minX: minX = point[0] if point[1] < minY: minY = point[1] 初始化minXminY,以便通过foor循环降低它。

我最终想要得到的东西:

1000000

问题:

我应该用什么值初始化这两个变量,什么是好的编码风格和无bug?

5 个答案:

答案 0 :(得分:1)

minX, minY = map(min, zip(*positions))

minX
# 31

minY
# 23

使用zip(*...)转换列表,将x坐标作为第一个子列表,将y坐标作为第二个子列表,然后使用map(min,...)相应地计算最小x和最小y。

答案 1 :(得分:1)

您可以在第一组值初始化它们。 像:

minX, minY = position[0]

这些意味着即使它们是最小的,也没关系。如果你不想要你,那么就不得不绕过这一对:

for point in positions[1:]:
    # loop code...

答案 2 :(得分:1)

编辑:在查看我的答案以提供发生情况的详细说明时,我发现我的解决方案与您的标准不符,因为您希望找到最小的x值并独立地找到最小的y值。我的解决方案只为元组提供了最小的x值。不仅如此,它以不必要的复杂方式实现了这一点,因为简单的minx, miny = min(*positions)会产生与minx, miny = min(zip(*zip(*positions)))相同的结果。如后面所述,我将输入转置两次,这会返回原始输入。是的,我知道 - 干得好!所以我会改变我的答案,但仍然为我的原始代码提供一些解释。

闪亮的新解决方案:

>>> minX, minY = map(min, *positions)
>>> minX
31
>>> minY
23

现在到了承诺的解释部分:

minX, minY = map(min, *positions)

星号/星号用于argument list unpacking。这意味着,包含的所有项目将作为单独的参数提供给positions函数,而不是单个列表map。在这种情况下,这将转换为map(min, [148, 23], [31, 89], [102, 89], [60, 100], [46, 41])

minX, minY = map(min, *positions)

现在让我们看看map

  

返回一个迭代器,它将函数应用于iterable的每个项目,从而产生结果。如果传递了额外的可迭代参数,则函数必须采用那么多参数,并且并行地应用于所有迭代的项。

因此map会将min函数并行应用于所有迭代的。这转换为:将min应用于所有第一项(x值),然后将min应用于所有第二项(y值)。正如所料,min每次返回它收到的最小参数。

奖金内容:

在我的原始解决方案中,我(过度)使用了一个巧妙的技巧:

zip(*positions)

现在zip与元组解包相结合做了什么?

  

返回元组的迭代器,其中第i个元组包含第i个元组   来自每个参数序列或迭代的元素。

因此得到的第一个元组将包含输入参数的每个第一个元素:

[148, 23], [31, 89], [102, 89], [60, 100], [46, 41] ==> [(148, 31, 102, 60, 46), (23, 89, 89, 100, 41)]
当您将列表的每个子列表视为单独的行时,这等于transpose of a matrix你的矩阵。

答案 3 :(得分:1)

这是您可以使用的另一种模式。它可以很明显地通过修改应用于其他情况。

>>> positions = [ [148, 23], [31, 89 ], [102, 89], [60, 100], [46, 41 ] ]
>>> minX = None
>>> minY = None
>>> for x,y in positions:
...     minX = min(x, minX) if minX else x
...     minY = min(y, minY) if minY else y

将每个必需结果设置为None。由于positions中的每个项目都包含两个项目,因此您可以使用for循环将每个项目解压缩为xy值。现在,如果尚未计算minX,则将其值设置为x,否则将其设置为自身的最小值x

答案 4 :(得分:0)

minX = minY = float('inf')

将导致无穷大的浮点表示,其大于所有其他数字。这是在python 2.7中执行此操作的合理方法。

在python 3中,

import math
minX = minY = math.inf

已添加,更清洁。