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

如何统计同一城市下各街道名称的出现次数并生成对应列表

问题描述

现有如下列表:

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]

尝试过两种方法但未得到预期结果:

  1. 使用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']
  1. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:30:57