假设我有一个名为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]
初始化minX
和minY
,以便通过foor循环降低它。
我最终想要得到的东西:
1000000
我应该用什么值初始化这两个变量,什么是好的编码风格和无bug?
答案 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循环将每个项目解压缩为x
和y
值。现在,如果尚未计算minX
,则将其值设置为x
,否则将其设置为自身的最小值x
。
答案 4 :(得分:0)
minX = minY = float('inf')
将导致无穷大的浮点表示,其大于所有其他数字。这是在python 2.7中执行此操作的合理方法。
在python 3中,
import math
minX = minY = math.inf
已添加,更清洁。