假设我有一个list
,名为positions
,其值如下:
positions = [
[148, 23],
[31, 89 ],
[102, 89],
[60, 100],
[46, 41 ]
]
这个列表基本上是(X | Y)坐标的列表。 现在我要得到这个列表的最小X坐标和最小Y坐标。在
我当前正在使用以下代码:
^{pr2}$您可能注意到,现在我使用1000000
初始化minX
和{
我最终想要的是:
minX = 31
minY = 23
我应该用什么值初始化这两个变量,什么是好的编码风格和无缺陷的?在
您可以在第一组值处初始化它们。 比如:
这意味着即使它们是最小的,也无所谓。如果你不想这样,你也不必在这一对上循环:
^{pr2}$编辑:在审阅我的答案以详细解释所发生的情况时,我发现我的解决方案与您的标准不符,因为您希望找到最小的x值和独立的最小y值。元组只提供了最小的解。不仅如此,它还以一种不必要的复杂方式做到了这一点,因为一个简单的
minx, miny = min(*positions)
将产生与我的minx, miny = min(zip(*zip(*positions)))
相同的结果。如后文所述,我将输入转置两次,这将返回原始输入。是的,我知道-干得好!所以我会改变我的答案,但仍然会对我原来的代码做一些解释。在闪亮的新解决方案:
现在到承诺的解释部分:
^{pr2}$星号用于argument list unpacking。这意味着,与单个列表
positions
不同,包含的所有项将作为单独的参数馈送给map
函数。在本例中,这将转换为map(min, [148, 23], [31, 89], [102, 89], [60, 100], [46, 41])
。在现在让我们来看看^{} :
因此} 函数并行地应用于所有iterable的项。这转化为:将
map
将把^{min
应用于所有第一项(x值),然后将min
应用于所有第二项(y值)。正如预期的那样,min
每次都返回它接收到的最小参数。在奖励内容:
在我最初的解决方案中,我使用了一个巧妙的技巧:
现在,^{} 与元组解包结合起来做什么呢?在
因此,生成的第一个元组将包含输入参数的每个第一个元素:
^{pr5}$当您将列表的每个子列表作为矩阵的一个单独的行查看时,这等于transpose of a matrix。使用
zip(*...)
可以对列表进行转置,x坐标作为第一个子列表,y坐标作为第二个子列表,然后使用map(min,...)
计算相应的最小x和最小y。在相关问题 更多 >
编程相关推荐