Python字典列表按城市分组提取姓名的替代实现方案有哪些?
实现方案
方案1:使用collections.defaultdict(最推荐,高效简洁)
这个方案时间复杂度为O(n),仅需遍历一次原列表,不会修改原数据,适配任意数量的同城市人员:
from collections import defaultdict res = defaultdict(list) for item in data: res[item["city"]].append(item["name"]) # 如需转普通字典可执行这一步,直接用defaultdict也支持正常字典操作 res = dict(res) print(res)
输出和你期望的结果完全一致。
方案2:无依赖的普通字典实现
不想导入额外模块的话,可以用字典的setdefault方法,逻辑和上面一致:
res = {} for item in data: res.setdefault(item["city"], []).append(item["name"]) print(res)
方案3:使用itertools.groupby(适合已按城市排序的场景)
如果你的原列表已经按city字段排序,或者不介意多一步排序开销,可以用这个更函数式的写法:
from itertools import groupby res = { city: [item["name"] for item in group] for city, group in groupby(sorted(data, key=lambda x: x["city"]), key=lambda x: x["city"]) } print(res)
原代码可优化点
你当前的实现有几个明显的问题:
- 会直接修改原
data列表里的字典对象,产生不必要的副作用 - 仅能处理每个城市最多2个人员的场景,如果某个城市有3个及以上的人结果就会出错
- 多次遍历、翻转列表、合并字典,做了很多无效操作,性能远低于上面的方案
- 用
set去重会打乱名字的原有顺序,如果有重名人员还会丢失数据
内容的提问来源于stack exchange,提问作者Rikky Bhai
相关产品推荐
相关产品推荐

