# 知识库

# 2.1.4 Python组合数据类型

组合数据类型将若干个值组合成一个单一的数据项，主要包括列表、元组、字典和集合。列表是有序且可变的集合，元素可为任意类型（含数字、字符串甚至其他列表），用方括号 `[]` 或 `list()` 创建，例如 `[1, 2, 3]`、`['a', 'b', 'c']`，`list('abc')` 得到 `['a', 'b', 'c']`。元组是有序且不可变的集合，用圆括号 `()` 或 `tuple()` 创建，如 `(2.3, 3.5)`、`tuple(['a', 'b', 'c'])` 得到 `('a', 'b', 'c')`；单元素元组必须写成 `(1213,)`，漏写逗号则得到整数。元组又称轻量级列表，成员方法只有 `count` 和 `index`。集合是无序且不重复的元素集合，用花括号 `{}` 或 `set()` 创建并自动去重，如 `{2, 3, 3, 4}` 结果为 `{2, 3, 4}`。字典用于存储键值对且无序，键必须是不可变类型（如字符串、整数或元组）且唯一，值可为任意类型，可用 `{"姓名": "张三", "年龄": 25, "籍贯": "广州"}` 或 `dict(name="Alice", age=25)` 创建。

序列中的元素有正索引和负索引：正索引从左侧 0 开始递增，负索引从右侧 -1 开始递减。切片语法为 `sequence[start:stop:step]`，包含 `start`、不包含 `stop`，默认步长为 1，且不修改原序列。例如：

```python
myList = [10, 20, 30, 40, 50]
print(myList[1:4])   # [20, 30, 40]
print(myList[:3])    # [10, 20, 30]
print(myList[2:])    # [30, 40, 50]
print(myList[::2])   # [10, 30, 50]
```

可用 `for element in iterable:` 遍历字符串、列表、元组、集合、字典和 `range` 对象。`range(start, stop, step)` 生成惰性整数序列，直接打印看不到具体值，需用 `list()` 转换，如 `list(range(5))` 得到 `[0, 1, 2, 3, 4]`，`list(range(0, 10, 2))` 得到 `[0, 2, 4, 6, 8]`。

列表常用方法：`append(x)` 在末尾添加一个元素；`extend(iterable)` 将可迭代对象的全部元素一次追加到末尾；`insert(i, x)` 在索引 `i` 处插入；`remove(x)` 删除第一次出现的指定元素（不存在则引发 `ValueError`）；`pop(i)` 移除并返回指定索引的元素（默认最后一个，越界引发 `IndexError`）；`index(x)` 返回首次出现的索引；`count(x)` 统计出现次数；`sort()` 原地升序排序，`sort(reverse=True)` 降序。列表生成式 `[expression for item in iterable if condition]` 可简洁生成新列表，如 `[x**2 for x in range(10)]` 得到平方数列表，`[x for x in range(10) if x % 2 == 0]` 筛出偶数。若列表的每个元素仍是列表，则构成二维列表，用 `列表对象[行索引][列索引]` 访问，如 `a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]` 时 `a[1][2]` 为 `6`。

字典用键访问值，如 `font['字体']`；键不存在会引发 `KeyError`，应使用 `get(键)` 或 `get(键, 默认值)`。为新键赋值则增加一项，为已有键赋值则覆盖原值。`pop(键)` 删除并返回对应值。`items()`、`keys()`、`values()` 分别返回键值对、键、值的可迭代对象，它们不是列表，可用 `for...in` 遍历。统计文本中各字符出现次数时应写 `dct[c] = dct.get(c, 0) + 1`，不能写 `dct[c] = dct[c] + 1`（键尚不存在会报错）。集合常用来去除可迭代对象中的重复元素，如 `set([1, 2, 2, 3, 4, 4, 4, 5])` 得到 `{1, 2, 3, 4, 5}`。常见坑：空 `{}` 是空字典而不是空集合，空集合应写 `set()`；`append` 一次只加一个元素，`extend` 才拆开追加；`remove` 只删除第一个匹配项；`sort()` 会修改原列表；单元素元组漏写逗号。

## 关键要点
- 组合数据类型把若干值合成一项，主要包括列表、元组、字典、集合。
- 列表有序可变，用 `[]` 或 `list()` 创建；元组有序不可变，用 `()` 或 `tuple()` 创建，单元素须写成 `(1213,)`。
- 集合无序不重复，用 `{}` 或 `set()` 创建并自动去重；空 `{}` 是空字典，空集合用 `set()`。
- 字典存键值对且无序；键须为不可变类型（字符串、整数或元组）且唯一，值可为任意类型。
- 正索引从 0 起、负索引从 -1 起；切片 `sequence[start:stop:step]` 含头不含尾，不改原序列。
- `range()` 惰性生成整数，需 `list()` 才能看到序列值；`for...in` 可遍历可迭代对象。
- 列表常用 `append`/`extend`/`insert`/`remove`/`pop`/`index`/`count`/`sort`；`sort()` 原地排序。
- 列表生成式：`[expression for item in iterable if condition]`；二维列表用 `a[行][列]` 访问。
- 字典用键或 `get()` 取值；`items()`/`keys()`/`values()` 返回可迭代对象；频次统计用 `get(c, 0)`。
- 元组又称轻量级列表，成员方法只有 `count` 和 `index`；集合常用于去重。
