Python 里”把 list 转成 map”通常指把列表转成字典,方便按 key 查询。几种常见场景:
1. 两个列表合并成 dict
keys = ["a", "b", "c"]
values = [1, 2, 3]
d = dict(zip(keys, values))
print(d) # {'a': 1, 'b': 2, 'c': 3}
2. 元组列表转 dict
data = [("a", 1), ("b", 2), ("c", 3)]
d = dict(data)
print(d) # {'a': 1, 'b': 2, 'c': 3}
3. 对象列表按字段索引(最常用)
把 list[dict] 转成按某个 key 索引的字典,避免每次用 next(x for x in lst if x["id"] == ...) 线性搜索:
users = [
{"id": 1, "name": "Tom"},
{"id": 2, "name": "Jack"},
{"id": 3, "name": "Lucy"}
]
user_map = {u["id"]: u for u in users}
print(user_map[2]) # {'id': 2, 'name': 'Jack'}
这是查询密集型代码里的常用优化:构建一次 O(n),之后每次查找 O(1)。
4. 统计频次(Counter)
from collections import Counter
lst = ["a", "b", "a", "c", "a"]
freq = Counter(lst)
print(freq) # Counter({'a': 3, 'b': 1, 'c': 1})
print(freq["a"]) # 3
print(freq.most_common(2)) # [('a', 3), ('b', 1)]
Counter 继承自 dict,支持 +、- 合并,常用于词频统计。
5. map() 函数式处理
Python 的 map() 不是字典,而是将函数应用到每个元素:
nums = [1, 2, 3, 4]
# 不推荐(用 list comprehension 更清晰)
result = list(map(lambda x: x * 2, nums))
# 推荐
result = [x * 2 for x in nums]
print(result) # [2, 4, 6, 8]
map() 返回迭代器,需要 list() 转换。列表推导式可读性更好,PyCharm 等工具也不会提示替换。
6. 分组 dict
按某个字段分组:
from collections import defaultdict
records = [
{"type": "A", "val": 1},
{"type": "B", "val": 2},
{"type": "A", "val": 3},
]
grouped = defaultdict(list)
for r in records:
grouped[r["type"]].append(r)
print(dict(grouped))
# {'A': [{'type': 'A', 'val': 1}, {'type': 'A', 'val': 3}],
# 'B': [{'type': 'B', 'val': 2}]}
快速对比
| 场景 | 写法 |
|---|---|
| 两个列表合并 | dict(zip(keys, vals)) |
| 元组列表 | dict(data) |
| 按字段索引 | {item["id"]: item for item in lst} |
| 统计频次 | Counter(lst) |
| 函数处理 | [f(x) for x in lst](推荐 comprehension) |
| 分组 | defaultdict(list) |
