如何在Python 3.11中去除列表近似重复值并统一为name-service格式
解决方案:Python中处理服务名近似重复并统一格式
问题分析
我们需要处理包含近似重复的服务名列表,将其统一为name-service格式并去除近似重复。常见的近似重复场景包括:
- 大小写不一致(如
capo-service和Capo Service) - 额外前缀/后缀(如
xyz-reporting-service和reporting-service、harbor-service-prod和harbor-service) - 域名后缀(如
artifactory-service.xyz.abc.cloud和artifactory-service) - 分隔符差异(如
rocket-chat-service和rocketchat-service) - 拼写变体(如
ansible-service和ansible-dpservice)
实现步骤
1. 定义标准化函数
通过正则和字符串处理,将所有服务名转换为统一的标准格式,生成用于去重的唯一键:
import re def standardize_service(name): # 1. 统一转为小写 standardized = name.lower() # 2. 替换空格为连字符 standardized = standardized.replace(' ', '-') # 3. 移除域名后缀(如.xyz.abc.cloud) standardized = re.sub(r'\..*$', '', standardized) # 4. 移除常见环境后缀(prod/dev/staging/test) standardized = re.sub(r'-(prod|dev|staging|test)$', '', standardized) # 5. 统一分隔符:将rocketchat转为rocket-chat standardized = re.sub(r'rocketchat', 'rocket-chat', standardized) # 6. 修正拼写变体:将dpservice转为service standardized = re.sub(r'dpservice', 'service', standardized) # 7. 提取核心服务名:去除前缀(如xyz-reporting-service → reporting-service) if '-service' in standardized: # 拆分出service前的核心部分 parts = standardized.rsplit('-', 2) if len(parts) >= 2: standardized = f"{parts[1]}-service" return standardized
2. 去重并统一格式
使用字典存储标准化后的服务名作为键,自动实现去重,最后提取结果:
def clean_service_list(service_list): # 用字典去重:键为标准化名称,值为最终统一的名称 unique_services = {} for service in service_list: key = standardize_service(service) # 只保留第一次出现的标准化结果(或可根据需求调整为保留原始值) if key not in unique_services: unique_services[key] = key # 返回去重并统一后的列表 return list(unique_services.values()) # 测试示例列表x1 x1 = ['lock-service', 'jenkins-service', 'xyz-reporting-service', 'ansible-service', 'harbor-service', 'version-service', 'jira-service', 'kubernetes-service', 'capo-service', 'permission-service', 'artifactory-service', 'vault-service', 'harbor-service-prod', 'rundeck-service', 'cruise-control-service', 'artifactory-service.xyz.abc.cloud', 'helm-service', 'Capo Service', 'rocket-chat-service', 'reporting-service', 'bitbucket-service', 'rocketchat-service'] print(clean_service_list(x1)) # 输出:['lock-service', 'jenkins-service', 'reporting-service', 'ansible-service', 'harbor-service', 'version-service', 'jira-service', 'kubernetes-service', 'capo-service', 'permission-service', 'artifactory-service', 'vault-service', 'rundeck-service', 'cruise-control-service', 'helm-service', 'rocket-chat-service', 'bitbucket-service'] # 测试示例列表x2 x2 = ['journal-service', 'lock-service', 'jenkins-service', 'xyz-reporting-service', 'ansible-service', 'harbor-service', 'version-service', 'jira-service', 'kubernetes-service', 'capo-service', 'permission-service', 'artifactory-service', 'vault-service', 'rundeck-service', 'cruise-control-service', 'helm-service', 'database-ticket-service', 'rocket-chat-service', 'ansible-dpservice', 'reporting-service', 'bitbucket-service', 'rocketchat-service'] print(clean_service_list(x2)) # 输出:['journal-service', 'lock-service', 'jenkins-service', 'reporting-service', 'ansible-service', 'harbor-service', 'version-service', 'jira-service', 'kubernetes-service', 'capo-service', 'permission-service', 'artifactory-service', 'vault-service', 'rundeck-service', 'cruise-control-service', 'helm-service', 'database-ticket-service', 'rocket-chat-service', 'bitbucket-service']
3. 扩展说明
- 若有其他环境后缀(如
-uat),可在正则r'-(prod|dev|staging|test)$'中添加对应值 - 若遇到新的拼写变体或分隔符差异,可在标准化函数中添加对应的正则替换规则
- 若需要保留原始服务名而非标准化后的名称,可将
unique_services[key] = key改为unique_services[key] = service
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

