# 问答库

# 2.1.4 Python组合数据类型（问答库）

1. 【单选题·易】组合数据类型将若干个值组合成一个单一的数据项。根据课程内容，组合数据类型主要包括：
   A. 整型、浮点型、复数、布尔值
   B. 列表、元组、字典、集合
   C. 字符串、字节、文件、模块
   D. 操作码、操作数、指令、程序
   **答案：B**
   **解析：** 课程明确指出组合数据类型主要有列表、元组、字典、集合。A 是基本数据类型，C、D 不属于本小节所讲的组合数据类型。

2. 【单选题·易】下列关于列表的说法正确的是：
   A. 列表无序且不可变
   B. 列表有序且可变，元素可以是任意类型
   C. 列表只能存放整数
   D. 创建列表只能使用 `list()`，不能使用 `[]`
   **答案：B**
   **解析：** 列表是有序且可变的集合，元素可为数字、字符串甚至其他列表。创建列表有 `[]` 和 `list()` 两种方法。

3. 【判断题·易】元组是一种有序且不可变的集合，一旦创建，元组的内容就无法更改。
   **答案：√**
   **解析：** 课程指出元组有序、不可变，元素可为任意类型，但创建后不能增删元素或改变元素值，因而又称轻量级列表。

4. 【判断题·易】执行 `{2, 3, 3, 4}` 得到的集合仍是 `{2, 3, 3, 4}`，因为花括号会保留重复元素。
   **答案：×**
   **解析：** 集合自动去除重复元素。`{2, 3, 3, 4}` 的结果是 `{2, 3, 4}`。

5. 【多选题·中】下列关于列表的说法正确的有：
   A. 可用方括号 `[]` 定义，元素之间用逗号分隔
   B. `list()` 可由一个可迭代对象构造列表，如 `list('abc')` 得到 `['a', 'b', 'c']`
   C. 列表可以嵌套，如 `[[4, 5], [6, 7]]`
   D. 列表一旦创建就不能增加或删除元素
   **答案：ABC**
   **解析：** A、B、C 均与课程示例一致。D 描述的是元组的不可变特性，列表是可变的，可用 `append`、`remove` 等方法增删元素。

6. 【单选题·中】运行下列程序，输出结果是什么？

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

   A. `[20, 30, 40]` / `[10, 20, 30]` / `[30, 40, 50]` / `[10, 30, 50]`
   B. `[10, 20, 30]` / `[10, 20, 30]` / `[20, 30, 40, 50]` / `[20, 40]`
   C. `[20, 30, 40, 50]` / `[10, 20, 30]` / `[30, 40, 50]` / `[10, 20, 30, 40, 50]`
   D. `[20, 30]` / `[10, 20, 30]` / `[30, 40]` / `[10, 30, 50]`
   **答案：A**
   **解析：** 切片含 `start`、不含 `stop`。`[1:4]` 取下标 1、2、3；`[:3]` 从开头取到下标 2；`[2:]` 从下标 2 取到末尾；`[::2]` 步长为 2，得到 `[10, 30, 50]`。切片不修改原列表。

7. 【单选题·中】运行下列程序，输出结果是什么？

```python
a = [1, 2, 3]
a.append(4)
a.extend([5, 6])
a.insert(1, 0)
print(a)
```

   A. `[1, 2, 3, 4, [5, 6], 0]`
   B. `[1, 0, 2, 3, 4, 5, 6]`
   C. `[0, 1, 2, 3, 4, 5, 6]`
   D. `[1, 2, 3, 4, 5, 6, 0]`
   **答案：B**
   **解析：** `append(4)` 在末尾添加一个元素，得到 `[1, 2, 3, 4]`；`extend([5, 6])` 把 5、6 拆开追加，得到 `[1, 2, 3, 4, 5, 6]`；`insert(1, 0)` 在索引 1 处插入 0，原有元素后移，得到 `[1, 0, 2, 3, 4, 5, 6]`。若误把 `extend` 当成 `append`，会把整个列表当作一个元素，从而错选 A。

8. 【判断题·中】对列表 `a = [1, 2, 3, 2, 4]` 执行 `a.remove(2)` 后，列表中两个 `2` 都会被删除。
   **答案：×**
   **解析：** `remove()` 只删除第一次出现的指定元素。执行后 `a` 变为 `[1, 3, 2, 4]`，后面那个 `2` 仍然保留。若元素不存在，会引发 `ValueError`。

9. 【多选题·中】字典的键必须是不可变类型，且每个键必须唯一。下列可以作为字典键的有：
   A. 字符串，如 `"姓名"`
   B. 整数，如 `25`
   C. 元组，如 `(1, 2)`
   D. 列表，如 `[1, 2]`
   **答案：ABC**
   **解析：** 课程指出字典的键必须是不可变类型，例如字符串、整数或元组。列表是可变对象，不能作为字典的键。值则可以是任意类型。

10. 【简答题·中】请从“是否有序、是否可变、如何创建、典型用途”四个方面，比较列表、元组、字典和集合。
    **答案：**
    - 列表：有序、可变；用 `[]` 或 `list()` 创建；适合存放需要增删改的序列。
    - 元组：有序、不可变；用 `()` 或 `tuple()` 创建，单元素须写成 `(1213,)`；适合存放不应被修改的数据，又称轻量级列表，成员方法只有 `count` 和 `index`。
    - 字典：按键值对存储且无序；用 `{}` 或 `dict()` 创建；键须不可变且唯一，适合按名字查找。
    - 集合：无序、元素不重复；用 `{}` 或 `set()` 创建并自动去重；常用于去除可迭代对象中的重复元素。
    **解析：** 评分要点：四种类型都写到；有序/可变判断正确；创建方式与课程一致；指出单元素元组的逗号、空 `{}` 是字典、集合用于去重中的至少两点。

11. 【单选题·难】运行下列程序，输出结果是什么？

```python
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
squares = [x**2 for x in range(10)]
evens = [x for x in range(10) if x % 2 == 0]
print(a[1][2])
print(squares)
print(evens)
```

   A. `6` / `[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]` / `[0, 2, 4, 6, 8]`
   B. `5` / `[1, 4, 9, 16, 25, 36, 49, 64, 81]` / `[2, 4, 6, 8]`
   C. `6` / `[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]` / `[1, 3, 5, 7, 9]`
   D. `[4, 5, 6]` / `[0, 1, 4, 9]` / `[0, 2, 4, 6, 8, 10]`
   **答案：A**
   **解析：** 二维列表用 `a[行索引][列索引]` 访问，`a[1][2]` 是第 2 行第 3 列的 `6`。`range(10)` 为 0 到 9，平方后含 `0` 和 `81`、不含 `100`。`x % 2 == 0` 筛出偶数，含 `0` 不含 `10`。

12. 【简答题·难】要用字典统计字符串中每个字母出现的次数（不区分大小写）。请写出完整可运行的程序，统计 `"Banana"` 的结果，并说明为什么不能写成 `dct[c] = dct[c] + 1`。
    **答案：** 程序如下：

```python
s = "Banana"
dct = {}
for c in s.lower():
    dct[c] = dct.get(c, 0) + 1
print(dct)
```

运行后字典中 `'b'` 为 1、`'a'` 为 3、`'n'` 为 2（字典无序，打印顺序可不作要求）。不能写 `dct[c] = dct[c] + 1`，因为某字母第一次出现时键尚不存在，直接用 `dct[c]` 会引发 `KeyError`；`get(c, 0)` 在键不存在时返回 0，从而可以累加。
    **解析：** 评分要点：①使用 `s.lower()`；②用 `get(c, 0)` 累加；③代码可直接运行；④正确解释 `KeyError`；⑤结果中三个字母的次数正确。漏写 `lower()` 或未说明 `get` 的作用应扣分。

13. 【单选题·难】运行下列程序，关于各对象类型的判断哪一项正确？

```python
x = (1213,)
y = (1213)
z = {}
w = set()
print(type(x), type(y), type(z), type(w))
```

   A. `x` 与 `y` 都是元组，`z` 与 `w` 都是集合
   B. `x` 是元组，`y` 是整数，`z` 是字典，`w` 是集合
   C. `x` 是元组，`y` 是元组，`z` 是字典，`w` 是字典
   D. `x` 是列表，`y` 是整数，`z` 是集合，`w` 是集合
   **答案：B**
   **解析：** 单元素元组必须带逗号，`(1213,)` 才是元组，`(1213)` 只是整数 1213。空 `{}` 创建的是空字典，空集合必须用 `set()`。这是组合数据类型里最容易混淆的两处写法。

14. 【多选题·中】下列操作会直接修改原列表对象的有：
   A. `a.append(4)`
   B. `a.extend([4, 5])`
   C. `a.sort()`
   D. `b = a[1:4]`
   **答案：ABC**
   **解析：** `append`、`extend`、`sort` 都在原列表上操作：`append`/`extend` 增加元素，`sort()` 原地重排。切片返回一个新序列，不修改原始列表，因此 D 不正确。
