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

Python中如何识别城市与历史国家名称并拆分字符串列表?

最佳实现思路:预定义地名集合 + 遍历分类

这个问题的核心难点确实在历史国家/城市名称的识别上——这类地名很多已经不被当前主流地理API(比如GeoPy、OpenStreetMap)收录,所以最靠谱且高效的方式,就是先预定义好已知的国家(含历史)和城市(含历史)集合,再遍历原列表完成分类。

具体步骤与代码实现

1. 先整理地名集合

首先,根据你给出的列表内容,把所有明确的国家(包括Prussia、DDR这类历史国家)和城市(包括Constantinople、Leningrad这类历史城市)整理成集合——用集合是因为查找速度比列表快很多:

# 预定义国家集合(包含历史国家)
country_set = {
    'Russia', 'France', 'Prussia', 'Austria', 'Sweden',
    'Great Britain', 'Spain', 'Portugal', 'Germany', 'DDR',
    'the United States'
}

# 预定义城市集合(包含历史城市)
city_set = {
    'Smolensk', 'Moscow', 'Constantinople', 'Frankfurt',
    'Leningrad', 'Paris', 'St. Helena'
}

2. 遍历分类,保留原重复项

接下来遍历你的原始列表,把每个元素分配到对应的列表里,还能保留原有的重复项(比如你的列表里有多个Moscow、Paris,分类后也会保留):

l = [ 'Russia', 'Smolensk', 'Moscow', 'Moscow', 'France', 'France', 'Russia', 'Prussia', 'Austria', 'Sweden', 'Constantinople', 'Russia', 'Great Britain', 'Spain', 'Portugal', 'Germany', 'Frankfurt', 'France', 'Leningrad', 'Paris', 'DDR', 'Paris', 'France', 'Paris', 'the United States', 'St. Helena', ]

l_countries = []
l_cities = []
unknown_items = []  # 可选:收集没匹配上的未知项,方便后续补全

for item in l:
    if item in country_set:
        l_countries.append(item)
    elif item in city_set:
        l_cities.append(item)
    else:
        unknown_items.append(item)

# 输出结果看看
print("国家列表:", l_countries)
print("城市列表:", l_cities)
if unknown_items:
    print("未识别的项:", unknown_items)

3. 后续扩展的小技巧

如果之后要加更多历史地名,别直接改代码,可以把集合存到外部配置文件里,比如JSON:

// places.json
{
  "countries": ["Russia", "France", "Prussia", ...],
  "cities": ["Smolensk", "Moscow", "Constantinople", ...]
}

然后在Python里读取:

import json

with open('places.json', 'r', encoding='utf-8') as f:
    place_data = json.load(f)
    country_set = set(place_data['countries'])
    city_set = set(place_data['cities'])

这样更新地名的时候不用动代码,直接改JSON就行。

如果是要处理大量未知的历史地名,那可以考虑训练自定义的NER(命名实体识别)模型(比如用spaCy训练包含历史地名的数据集),但这种方式复杂度高,适合大规模场景,你的需求用预定义集合完全足够。

为啥不推荐用地理API?

像GeoPy这类工具主要管现存的地名,对于Prussia(已经消失的国家)、Constantinople(现在叫伊斯坦布尔)这类历史地名,要么识别不出来,要么返回的结果不符合你的分类需求,所以预定义集合是最精准的选择。

内容的提问来源于stack exchange,提问作者Ouss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:14:48