如何统计同一城市下各街道名称的出现次数并生成对应列表
问题描述
现有如下列表:
list1 = [ {'city': 'Tehran', 'street': 'Ferdowsi'}, {'city': 'Tabriz', 'street': 'Imam'}, {'city': 'Sari', 'street': 'Qaran'}, {'city': 'Tehran', 'street': 'Enghelab'}, {'city': 'Tabriz', 'street': 'Imam'}, {'city': 'Tehran', 'street': 'Kan'}, {'city': 'Tehran', 'street': 'Kan'}, {'city': 'Sari', 'street': 'Nader'}, {'city': 'Sari', 'street': 'Nader'}, ]
需要统计每个城市下相同名称街道的出现次数,并生成两种格式的结果:
第一种格式:
Tehran 1 Ferdowsi Tabriz 2 Imam Sari 1 Qaran Tehran 1 Enghelab Tehran 2 Kan Sari 2 Nader
第二种格式:
Tehran [Ferdowsi] Tabriz [Imam, Imam] Sari [Qaran] Tehran [Enghelab] Tehran [Kan, Kan] Sari [Nader, Nader]
尝试过两种方法但未得到预期结果:
- 使用
defaultdict(list)获取每个城市的所有街道列表:
from collections import defaultdict cities = defaultdict(list) for name in list1: cities[name['city']].append(name['street'])
输出:
>>> for x in cities: print(x, cities[x]) ... Tehran ['Ferdowsi', 'Enghelab', 'Kan', 'Kan'] Tabriz ['Imam', 'Imam'] Sari ['Qaran', 'Nader', 'Nader']
- 使用
Counter统计所有街道的出现次数:
from collections import Counter counts = Counter(row["street"] for row in list1)
输出:
>>> for x in counts: print(x, counts[x]) ... Ferdowsi 1 Imam 2 Qaran 1 Enghelab 1 Kan 2 Nader 2
解决方案
可以使用**嵌套的defaultdict(Counter)**实现需求,先统计每个城市下各街道的出现次数,再基于统计结果生成两种格式的输出。
步骤1:统计城市-街道的出现次数
from collections import defaultdict, Counter # 嵌套结构:key为城市名,value为Counter(统计该城市下各街道的次数) city_street_counts = defaultdict(Counter) for item in list1: city = item['city'] street = item['street'] city_street_counts[city][street] += 1
此时city_street_counts的结构为:
{ 'Tehran': Counter({'Kan': 2, 'Ferdowsi': 1, 'Enghelab': 1}), 'Tabriz': Counter({'Imam': 2}), 'Sari': Counter({'Nader': 2, 'Qaran': 1}) }
步骤2:生成第一种格式的输出
遍历每个城市的街道统计结果,按城市 次数 街道的格式输出:
print("第一种格式输出:") for city, street_counter in city_street_counts.items(): for street, count in street_counter.items(): print(f"{city} {count} {street}")
步骤3:生成第二种格式的输出
遍历统计结果,将街道重复对应次数后组成列表,按城市 [街道1, 街道2...]的格式输出:
print("\n第二种格式输出:") for city, street_counter in city_street_counts.items(): for street, count in street_counter.items(): street_list = [street] * count street_str = ", ".join(street_list) print(f"{city} [{street_str}]")
补充:匹配示例中的输出顺序
如果需要和示例的输出顺序(按原始列表中城市-街道组合首次出现的顺序)一致,可以先记录唯一组合的出现顺序,再按顺序输出:
# 记录首次出现的城市-街道组合顺序 seen = set() order = [] for item in list1: key = (item['city'], item['street']) if key not in seen: seen.add(key) order.append(key) # 按示例顺序输出第一种格式 print("按示例顺序的第一种格式:") for city, street in order: count = city_street_counts[city][street] print(f"{city} {count} {street}") # 按示例顺序输出第二种格式 print("\n按示例顺序的第二种格式:") for city, street in order: count = city_street_counts[city][street] street_str = ", ".join([street]*count) print(f"{city} [{street_str}]")
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

