🎯 本章你会学到:四种内置容器怎么选,以及推导式这个效率神器。建议边读边敲,每节练习先自己做,再展开答案对照。
Python 把常用数据结构做进了语言本身:列表(有序可变)、元组(有序不可变)、字典(键值映射)、集合(去重)。选对容器,代码往往能短一半。
| 容器 | 写法 | 特点 | 典型用途 |
|---|---|---|---|
| list | [1, 2, 3] | 有序、可变、允许重复 | 顺序数据、需要频繁增删尾部 |
| tuple | (1, 2, 3) | 有序、不可变 | 固定结构的数据、函数返回多个值 |
| dict | {"a": 1} | 键值映射,查找 O(1) | 统计、索引、缓存 |
| set | {1, 2, 3} | 去重、无序、查找 O(1) | 去重、判断存在、集合运算 |
容器基本操作
nums = [3, 1, 4, 1, 5]
print(len(nums), sum(nums), max(nums), min(nums))
print(sorted(nums), sorted(set(nums)))
nums.append(9)
print(nums)
freq = {}
for w in ["apple", "banana", "apple"]:
freq[w] = freq.get(w, 0) + 1
print(freq)运行结果
5 14 5 1
[1, 1, 3, 4, 5] [1, 3, 4, 5]
[3, 1, 4, 1, 5, 9]
{'apple': 2, 'banana': 1}
推导式:一行生成一个容器
列表 / 字典推导式
squares = [x * x for x in range(1, 6)]
evens = [x for x in range(10) if x % 2 == 0]
index = {name: i for i, name in enumerate(["Ann", "Bob"])}
print(squares)
print(evens)
print(index)
print([[r * c for c in range(1, 4)] for r in range(1, 4)])运行结果
[1, 4, 9, 16, 25]
[0, 2, 4, 6, 8]
{'Ann': 0, 'Bob': 1}
[[1, 2, 3], [2, 4, 6], [3, 6, 9]]
- 列表推导式
[x * x for x in range(5)]比手写 for + append 快且短。 - 带条件:
[x for x in nums if x % 2 == 0]。 - 字典推导式:
{name: i for i, name in enumerate(names)}。 - 嵌套推导式能生成二维结构,但超过两层就该拆开写,否则没人看得懂。
⚠️ 易错点 字典的键必须可哈希(数字、字符串、元组可以,列表不行)。
⚠️ 易错点 不要用可变对象当函数默认参数(
def f(a, b=[]))——默认值只在定义时创建一次,会被所有调用共享。✍️ 本节练习
3.1必做去重排序
读入 n 个整数,去重后按升序输出(空格分隔)。
输入 第一行 n;第二行 n 个整数。
输出 一行:去重升序序列。
样例输入
6
3 1 4 1 5 3样例输出
1 3 4 5💡 提示 set(nums) 去重,sorted(...) 排序。
✅ 查看参考答案与解析
n = int(input())
nums = list(map(int, input().split()))
print(" ".join(str(v) for v in sorted(set(nums))))解析 " ".join(str(v) for v in ...) 是 Python 输出空格分隔序列的惯用写法,天然不会在末尾多空格。
3.2挑战词频排行
读入一行单词,统计每个单词出现次数,按次数降序、同次数按字典序升序,输出前 3 行「单词 次数」。
输入 一行若干单词。
输出 最多三行:单词 次数。
样例输入
apple banana apple cherry banana apple样例输出
apple 3
banana 2
cherry 1💡 提示 用字典计数,然后用 sorted(..., key=lambda kv: (-kv[1], kv[0])) 排序。
✅ 查看参考答案与解析
words = input().split()
freq = {}
for w in words:
freq[w] = freq.get(w, 0) + 1
rank = sorted(freq.items(), key=lambda kv: (-kv[1], kv[0]))
for word, count in rank[:3]:
print(f"{word} {count}")解析 key 返回元组 (-次数, 单词):负号实现次数降序,单词本身升序——这是 Python 里多关键字排序的标准技巧。