如何将城市对象列表转换为按州分组的字典?解决值覆盖问题
解决城市列表按州分组的问题
嗨,这个问题我太熟了!你之前的代码之所以只保留每个州的最后一个城市,是因为字典的键是唯一的——每次遇到同一个州的城市,新的x.name都会直接覆盖掉之前的值,自然就只剩最后一个啦。下面给你几种最优的实现方式,按实用性排序:
方法一:用collections.defaultdict(最推荐)
这是Python处理这类分组问题最常用的方案,代码简洁又高效,还不用手动判断键是否存在:
from collections import defaultdict state_cities = defaultdict(list) for city_obj in objectList: state_cities[city_obj.state].append(city_obj.name)
defaultdict会自动为不存在的键创建一个空列表,你只需要循环每个城市对象,把城市名追加到对应州的列表里就行,省心又省力。
方法二:用普通字典+setdefault(无需额外导入)
如果不想导入模块,用原生字典的setdefault方法也能搞定:
state_cities = {} for city_obj in objectList: state_cities.setdefault(city_obj.state, []).append(city_obj.name)
setdefault的作用是:如果键不存在,就把键和默认值(这里是空列表)加入字典,然后返回这个默认值;如果键已经存在,就直接返回对应的值。这样我们就能直接对返回的列表执行append操作啦。
效率对比
- 当处理大量数据时,
defaultdict的性能会略优于setdefault,因为它内部少了一次键的存在性检查。 - 两种方法的时间复杂度都是O(n),n是你的城市对象数量,属于最优的时间复杂度。
内容的提问来源于stack exchange,提问作者jp3434
相关产品推荐
相关产品推荐

