numpy、itertools、List的用法

该篇博客介绍了一个Python实现的算法,用于在xy平面上的一组点中找到能构成矩形的点对,计算并返回这些点形成的任意矩形的最小面积。算法涉及到向量的叉积和范数计算,以及组合数学的概念。输入为点的坐标列表,输出为最小面积,若无法形成矩形则返回0。示例展示了如何使用该算法处理一组特定的点集。
给定在 xy 平面上的一组点,确定由这些点组成的任何矩形的最小面积,其中矩形的边不一定平行于 x 轴和 y 轴。

如果没有任何矩形,就返回 0。

在这里插入图片描述

import collections
import itertools
from typing import List

import numpy
class Solution:
    def minAreaFreeRect(self,points:List[List[int]] )->float:
        cro,nor=numpy.cross,numpy.linalg.norm
        points=[*map(numpy.array,points)]
        ans,d=float('inf'),collections.defaultdict(list)
        for x,y in  itertools.combinations(points,2):
            p,q=tuple(x+y),nor(x-y)
            d[p,q]+=[x-y]
        for idxs in d.values():
            for x,y in  itertools.combinations(idxs,2):
                ans=min(ans,abs(cro(x,y)))
        return ans/2 if ans <float('inf') else 0.0


input = [[1,2],[2,1],[1,0],[0,1]]
b=Solution()
result = b.minAreaFreeRect(input)
print(result)

在这里插入图片描述

### 不使用 NumPy 实现列表元素逐位相加 在 Python 中,可以通过多种方式实现两个列表 `a` 和 `b` 对应位置上的元素逐一相加而不依赖于外部库如 NumPy。以下是几种常见的方法: #### 方法一:使用简单的 `for` 循环 通过遍历索引的方式访问并操作两个列表中的对应元素。 ```python a = [1, 2, 3, 4, 5] b = [2, 3, 4, 5, 6] c = [] length = min(len(a), len(b)) # 防止长度不同引发错误 for i in range(length): c.append(a[i] + b[i]) print(c) # 输出 [3, 5, 7, 9, 11] ``` 这种方法简单直观,适用于初学者理解基本逻辑[^2]。 --- #### 方法二:利用列表推导式 列表推导式是一种简洁而高效的语法结构,能够显著减少代码量。 ```python a = [1, 2, 3, 4, 5] b = [2, 3, 4, 5, 6] c = [x + y for x, y in zip(a, b)] print(c) # 输出 [3, 5, 7, 9, 11] ``` 这里的关键在于内置函数 `zip()`,它会将多个可迭代对象打包成元组形式,并自动截断到最短序列的长度。 --- #### 方法三:借助 `map()` 函数与匿名函数(lambda) `map()` 是一种高阶函数,用于对指定序列应用某个特定的操作。 ```python a = [1, 2, 3, 4, 5] b = [2, 3, 4, 5, 6] c = list(map(lambda x, y: x + y, a, b)) print(c) # 输出 [3, 5, 7, 9, 11] ``` 此方法同样基于 `zip()` 的行为特性来处理输入数据流。 --- #### 方法四:考虑异常情况下的健壮性设计 当两列表长度不一致时,上述三种方法均默认取较短者为准。如果希望保留较长部分,则需额外调整策略。 ```python from itertools import zip_longest a = [1, 2, 3, 4, 5] b = [2, 3, 4] c = [ (x or 0) + (y or 0) for x, y in zip_longest(a, b, fillvalue=0) ] print(c) # 输出 [3, 5, 7, 4, 5] ``` 此处引入了模块 `itertools.zip_longest()` 来支持填充缺失项的功能。 --- ### 总结 以上四种方法均可满足题目需求,在实际开发过程中可根据具体场景和个人偏好选择合适的技术路线。其中前两种更为常见且易于维护;而后两者则展示了更高级别的抽象能力以及应对复杂条件的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigData-0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值