Python list 转 dict 的几种写法

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)