Python 列表和字典怎么选:查询、去重、分组和性能差异
用常见数据处理任务讲清 list、dict、set 的选择:什么时候用列表遍历,什么时候用字典索引,什么时候用集合去重。
相关工具
不是谁更高级,而是谁更适合
列表和字典没有绝对好坏。列表适合保留顺序、逐条遍历、保存一批同类数据;字典适合按 key 快速查找、做映射、做分组统计;集合适合去重和判断存在。选择数据结构,本质是看你后面要做什么操作。
如果你只是把一批文章按顺序展示,用列表就行。如果你要根据 slug 快速找到某篇文章,用字典更合适。如果你要判断某个关键词是否已经出现过,用集合更直接。
比如把文章列表转成按 slug 查询的字典:
articles = [
{"slug": "python-list", "title": "Python 列表"},
{"slug": "python-dict", "title": "Python 字典"},
]
article_map = {item["slug"]: item for item in articles}
print(article_map["python-dict"]["title"])大量查询时不要反复遍历列表
如果只有几十条数据,列表遍历没有什么问题。但如果你有几万条记录,并且要反复按 ID 查找,列表每次都从头找就会变慢。更好的做法是先建立字典索引,再按 key 查询。
对比写法:
users = [
{"id": 1, "name": "张三"},
{"id": 2, "name": "李四"},
]
user_map = {user["id"]: user for user in users}
target = user_map.get(2)
print(target)这类思路在 CSV 合并、订单匹配、用户资料补全里很常见。先把小表或常查表做成字典,再遍历主表补字段,会比双层循环清楚很多。
分组统计适合用字典
做统计时,字典非常好用。比如统计每个分类有多少篇文章、每个城市有多少用户、每种状态有多少订单。key 是分类或状态,value 是数量或列表。
示例:
orders = [
{"status": "paid", "amount": 99},
{"status": "pending", "amount": 49},
{"status": "paid", "amount": 199},
]
count_by_status = {}
for order in orders:
status = order["status"]
count_by_status[status] = count_by_status.get(status, 0) + 1
print(count_by_status)如果要保存每组的明细,value 可以是列表。比如按分类把文章分组,按用户 ID 把订单分组。这比创建很多变量更清楚。
去重用集合,但要注意顺序
集合适合快速去重,但普通集合不强调顺序。如果你只想知道有哪些不同关键词,用 set 很方便;如果你想去重后仍保留首次出现顺序,可以用一个 seen 集合配合结果列表。
保留顺序去重:
items = ["JSON", "Python", "JSON", "CSV", "Python"]
seen = set()
result = []
for item in items:
if item in seen:
continue
seen.add(item)
result.append(item)
print(result)性能优化不用一开始就想得很重。先把逻辑写对,数据量变大、速度明显慢时,再看是不是列表查询、双层循环、重复解析文件造成的问题。
常见问题
列表查询一定很慢吗?
小数据量没问题。大量数据并且反复按 key 查找时,建议先建字典索引。
字典会不会打乱顺序?
现代 Python 字典会保留插入顺序,但它的主要价值仍然是按 key 查询。
去重后要保留顺序怎么办?
用 seen 集合判断重复,同时用列表保存结果。