56. 合并区间 @Python @Go

原题

https://leetcode.cn/problems/merge-intervals/description/

思路

排序 + 遍历

复杂度

时间:O(n)
空间:O(n)

Python代码

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        ans = []
        intervals.sort()
        for i in range(len(intervals)):
            # 可以合并
            if i > 0 and intervals[i][0] <= ans[-1][1]:
                ans[-1][1] = max(ans[-1][1], intervals[i][1])
            else:
                ans.append(intervals[i])
        return ans 

Go代码

func merge(intervals [][]int) [][]int {
	var ans [][]int
	sort.Slice(intervals, func(i, j int) bool {
		return intervals[i][0] < intervals[j][0]
	})
	for i := 0; i < len(intervals); i++ {
		// 可以合并
		if i > 0 && intervals[i][0] <= ans[len(ans)-1][1] {
			ans[len(ans)-1][1] = max(ans[len(ans)-1][1], intervals[i][1])
		} else {
			ans = append(ans, intervals[i])
		}
	}
	return ans
}
<think>我们正在讨论Python 3中的装饰器`@cappa.command`和`@dataclass`。注意,用户提到了`cappa`,这是一个命令行解析库,类似于`click`或`argparse`,但使用类型注解和dataclasses来定义命令。`@dataclass`是Python标准库中的装饰器,用于创建数据类。 首先,我们分别解释这两个装饰器,然后展示如何结合使用它们来创建命令行应用。 ### 1. `@dataclass` 装饰器 `@dataclass` 是Python 3.7引入的,位于`dataclasses`模块中。它用于自动生成特殊方法(如`__init__`、`__repr__`等)的类,从而简化数据容器的创建。 示例: ```python from dataclasses import dataclass @dataclass class Person: name: str age: int ``` ### 2. `@cappa.command` 装饰器 `cappa`是一个第三方库,用于构建命令行接口(CLI)。它利用类型注解和dataclasses来定义命令和参数。使用`@cappa.command`装饰器可以将一个dataclass标记为一个命令。 安装cappa:使用pip安装,命令为`pip install cappa`。 ### 3. 结合使用 结合`@dataclass`和`@cappa.command`可以轻松定义命令行参数和选项。 示例: ```python import cappa from dataclasses import dataclass @cappa.command(help="A simple command") @dataclass class Command: name: str = cappa.Arg(help="Your name") age: int = cappa.Arg(help="Your age", default=18) verbose: bool = cappa.Option('-v', '--verbose', help="Enable verbose mode", default=False) if __name__ == "__main__": command = cappa.parse(Command) print(f"Hello, {command.name}! Age: {command.age}, Verbose: {command.verbose}") ``` 在上面的例子中: - 我们定义了一个`Command`类,并用`@dataclass`和`@cappa.command`装饰。 - 字段`name`和`age`是位置参数(用`cappa.Arg`定义),`verbose`是选项(用`cappa.Option`定义)。 - `cappa.parse`函数解析命令行参数并返回一个`Command`类的实例。 ### 4. 运行命令 假设文件名为`cli.py`,在终端中运行: ```bash python cli.py John 25 --verbose ``` 输出: ``` Hello, John! Age: 25, Verbose: True ``` ### 注意事项 - `cappa`支持嵌套命令、子命令等高级功能。 - 确保字段类型注解正确,因为cappa会根据类型进行参数解析。 - 可以使用`cappa.Arg`和`cappa.Option`的更多参数来定制行为,如`default`、`help`、`choices`等。 ### 相关问题 1. 如何在cappa中定义子命令? 2. dataclass中如何设置字段的默认值? 3. cappa支持哪些参数类型? 4. 如何处理cappa中的错误输入? </think>在 Python 3 中,`@dataclass` 和 `@cappa.command` 是两个不同用途的装饰器,通常结合使用来创建命令行工具。以下是详细说明和使用方法: --- ### 一、`@dataclass` 装饰器 来自 Python 标准库 `dataclasses`,用于自动生成特殊方法(如 `__init__`, `__repr__`),简化数据类的定义。 #### 基本用法: ```python from dataclasses import dataclass @dataclass class User: name: str age: int is_active: bool = True # 带默认值的字段 # 自动生成 __init__ 和 __repr__ user = User(name="Alice", age=30) print(user) # 输出: User(name='Alice', age=30, is_active=True) ``` #### 核心特性: 1. **自动生成方法**:无需手动编写 `__init__`, `__repr__`, `__eq__` 等方法 2. **类型注解**:强制使用类型提示(如 `name: str`) 3. **默认值**:可设置字段默认值(如 `is_active: bool = True`) 4. **不可变实例**:添加 `@dataclass(frozen=True)` 使实例不可修改 --- ### 二、`@cappa.command` 装饰器 来自第三方库 `cappa`(需安装:`pip install cappa`),用于将 `dataclass` 转换为命令行接口(CLI)。 #### 典型工作流: 1. 用 `@dataclass` 定义命令参数 2. 用 `@cappa.command` 标记为 CLI 命令 3. 用 `cappa.parse()` 解析命令行输入 #### 基础示例: ```python from dataclasses import dataclass import cappa @cappa.command(help="用户管理命令") # CLI 元数据 @dataclass class AddUser: name: str # 位置参数 age: int # 位置参数 is_admin: bool = False # 选项参数(默认值) if __name__ == "__main__": # 解析命令行参数并实例化 AddUser command = cappa.parse(AddUser) print(f"添加用户: {command.name}, 年龄: {command.age}") ``` #### 参数类型说明: | 参数字段 | 对应命令行参数 | |--------------------|----------------------| | `name: str` | 位置参数 `NAME` | | `age: int` | 位置参数 `AGE` | | `is_admin: bool` | 选项 `--is-admin` | #### 高级配置: ```python from dataclasses import dataclass, field import cappa @cappa.command(name="add", help="添加用户") @dataclass class AddUser: username: str = cappa.Arg(help="用户名") # 自定义帮助文本 age: int = cappa.Arg(default=18) # 设置默认值 roles: list[str] = field( default_factory=list, metadata={"cappa": cappa.Arg(short="-r", long="--role")} ) # 列表类型参数 if __name__ == "__main__": command = cappa.parse(AddUser) # 使用: python script.py alice -r admin -r editor ``` --- ### 三、结合使用场景 #### 完整 CLI 应用示例: ```python # app.py from dataclasses import dataclass import cappa @cappa.command(help="添加用户") @dataclass class AddUser: name: str email: str = cappa.Arg("--email", "-e") # 选项参数 @cappa.command(help="删除用户") @dataclass class DeleteUser: user_id: int force: bool = cappa.Arg("--force", "-f", default=False) if __name__ == "__main__": # 自动支持子命令 cappa.invoke() ``` #### 终端使用: ```bash # 添加用户 python app.py add-user Alice --email alice@example.com # 删除用户 python app.py delete-user 123 --force ``` --- ### 四、常见问题解答 1. **为什么需要结合使用?** `@dataclass` 提供结构化数据模型,`@cappa.command` 将其映射为 CLI 参数,实现声明式 CLI 开发[^1]。 2. **如何安装依赖?** ```bash pip install cappa # dataclasses 是 Python 3.7+ 标准库 ``` 3. **如何处理复杂类型?** 使用 `cappa.Arg` 的 `parse` 参数: ```python def parse_role(value: str) -> Role: return Role[value.upper()] role: Role = cappa.Arg(parse=parse_role) ``` 4. **如何添加参数验证?** 在 `dataclass` 中使用 `__post_init__`: ```python @dataclass class AddUser: age: int def __post_init__(self): if self.age < 0: raise ValueError("年龄不能为负数") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值