搜索最小值时用大数初始化变量

2024-09-27 09:27:59 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个list,名为positions,其值如下:

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

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

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

^{pr2}$

您可能注意到,现在我使用1000000初始化minX和{},这样foor循环就会降低它。在

我最终想要的是:

minX = 31
minY = 23

问题:

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


Tags: 代码编码列表风格listpositionspr2minx
3条回答

您可以在第一组值处初始化它们。 比如:

minX, minY = position[0]

这意味着即使它们是最小的,也无所谓。如果你不想这样,你也不必在这一对上循环:

^{pr2}$

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

闪亮的新解决方案:

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

现在到承诺的解释部分:

^{pr2}$

星号用于argument list unpacking。这意味着,与单个列表positions不同,包含的所有项将作为单独的参数馈送给map函数。在本例中,这将转换为map(min, [148, 23], [31, 89], [102, 89], [60, 100], [46, 41])。在

minX, minY = map(min, *positions)

现在让我们来看看^{}

Return an iterator that applies function to every item of iterable, yielding the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel.

因此map将把^{}函数并行地应用于所有iterable的。这转化为:将min应用于所有第一项(x值),然后将min应用于所有第二项(y值)。正如预期的那样,min每次都返回它接收到的最小参数。在


奖励内容:

在我最初的解决方案中,我使用了一个巧妙的技巧:

zip(*positions)

现在,^{}与元组解包结合起来做什么呢?在

Returns an iterator of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables.

因此,生成的第一个元组将包含输入参数的每个第一个元素:

^{pr5}$当您将列表的每个子列表作为矩阵的一个单独的行查看时,这等于transpose of a matrix
minX, minY = map(min, zip(*positions))

minX
# 31

minY
# 23

使用zip(*...)可以对列表进行转置,x坐标作为第一个子列表,y坐标作为第二个子列表,然后使用map(min,...)计算相应的最小x和最小y。在

相关问题 更多 >

    热门问题