You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:06:05