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
相关产品推荐
相关产品推荐

