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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:34:53