# G3-21 课后练习 —— 综合项目一
> **GESP等级：三级 | 考级考点：GESP Python 三级**

**姓名：__________  日期：__________**

---

> 面向7-10岁少儿 | G3 算法入门 | 集合与列表综合应用

---

## 一、填空题（回顾概念）

**题目1：** 列表用____括起来，集合用____括起来。列表____重复元素，集合____重复元素（可以/不可以）。

**题目2：** `len({1, 2, 3, 2, 1})` 的值是____。`sorted([3, 1, 4, 1, 5])` 的结果是____。

---

## 二、代码补全（补写代码）

**题目3：** 编写"投票统计器"：10位同学投票选择最喜爱的水果，统计每种水果的票数，找出票数最高的水果。补全代码。

```python
votes = ["苹果", "香蕉", "苹果", "橙子", "香蕉", "苹果", "葡萄", "橙子", "苹果", "香蕉"]

# 用集合获取所有水果品种
fruits = ____(votes)
print("候选水果：", fruits)

# 统计每种水果的票数
for fruit in fruits:
    count = votes.____(fruit)
    print(f"{fruit}：{count}票")

# 找出票数最高的水果（用max）
max_fruit = ____(fruits, key=votes.____)
print(f"\n🏆 最受欢迎的水果是：{max_fruit}，共{votes.count(max_fruit)}票")
```

**题目4：** 有两个骰子各投100次，记录每次的点数，找出两个骰子同时出现6的次数。补全代码。

```python
import random

# 模拟投骰子
dice1 = [random.randint(1, 6) for _ in range(____)]
dice2 = [random.randint(1, 6) for _ in range(____)]

# 方法1：用for循环统计
count = 0
for i in range(100):
    if dice1[i] == 6 ____ dice2[i] == 6:
        count = count + 1
print(f"两个骰子同时出现6的次数：{count}")

# 方法2：用列表推导式统计
count2 = ____(1 for i in range(100) if dice1[i] == 6 and dice2[i] == 6)
print(f"验证结果：{count2}")
```

---

## 三、创作题（动手编程）

**题目5：** 综合项目：编写一个"班级图书角管理系统"。
- 初始图书集合：`books = {"西游记", "三国演义", "小王子", "哈利波特", "鲁滨逊漂流记", "安徒生童话"}`
- 创建借阅记录字典：`records = {"小明": ["西游记", "小王子"], "小红": ["哈利波特"]}`
- 实现以下功能：
  1. 显示所有可借图书（未被借走的）
  2. 小明归还"西游记"（从借阅记录移除，图书加回集合）
  3. 小刚借走"鲁滨逊漂流记"（从集合移除，加入借阅记录）
  4. 显示最终图书状态和借阅情况

请写出完整代码。

<details>
<summary>参考答案</summary>

**题目1：** `[]`（方括号），`{}`（花括号），可以，不可以

**题目2：** 3，[1, 1, 3, 4, 5]

**题目3：**
```python
votes = ["苹果", "香蕉", "苹果", "橙子", "香蕉", "苹果", "葡萄", "橙子", "苹果", "香蕉"]

fruits = set(votes)
print("候选水果：", fruits)

for fruit in fruits:
    count = votes.count(fruit)
    print(f"{fruit}：{count}票")

max_fruit = max(fruits, key=votes.count)
print(f"\n🏆 最受欢迎的水果是：{max_fruit}，共{votes.count(max_fruit)}票")
```

**题目4：**
```python
import random

dice1 = [random.randint(1, 6) for _ in range(100)]
dice2 = [random.randint(1, 6) for _ in range(100)]

count = 0
for i in range(100):
    if dice1[i] == 6 and dice2[i] == 6:
        count = count + 1
print(f"两个骰子同时出现6的次数：{count}")

count2 = sum(1 for i in range(100) if dice1[i] == 6 and dice2[i] == 6)
print(f"验证结果：{count2}")
```

**题目5：**
```python
books = {"西游记", "三国演义", "小王子", "哈利波特", "鲁滨逊漂流记", "安徒生童话"}
records = {"小明": ["西游记", "小王子"], "小红": ["哈利波特"]}

# 1. 显示可借图书
borrowed = set()
for v in records.values():
    borrowed.update(v)
available = books - borrowed
print("可借图书：", available)

# 2. 小明归还"西游记"
records["小明"].remove("西游记")
print("\n小明归还了西游记")
print("小明当前借阅：", records["小明"])

# 3. 小刚借走"鲁滨逊漂流记"
books.remove("鲁滨逊漂流记")
records["小刚"] = ["鲁滨逊漂流记"]
print(f"\n小刚借走了鲁滨逊漂流记")

# 4. 最终状态
print("\n===== 最终状态 =====")
for person, book_list in records.items():
    print(f"{person} 借了：{book_list}")
print(f"图书馆剩余图书（未借出）：{books}")
```
</details>


---

**自我评价：** □ 全都会了  □ 大部分会了  □ 还要再练练
