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

如何利用Python脚本去除字典中字符串的反向重复项?

问题

给定一个Python字典,其中每个键对应一个字符串集合,需要移除集合中的反向重复字符串(例如"AB"和"BA"视为重复,只保留其中一个)。可以参考以下处理元组重复的逻辑来实现:

mylist = [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2), (3, 3)]
mylist = [sorted(item) for item in mylist]
mylist = list(set(map(tuple, mylist)))
print(mylist)

# 输出:[(1, 2), (1, 3), (2, 3), (3, 3)]

原始字典如下:

{
    2: {"B", "AA"},
    3: {"C", "BA", "AB"},
    4: {"D", "BB", "CA", "AC"},
    5: {"AD", "E", "CB", "DA", "BC"},
    6: {"CC", "F", "EA", "DB", "AE", "BD"},
    7: {"G", "CD", "DC", "AF", "FA", "BE", "EB"},
    8: {"CE", "AG", "DD", "BF", "GA", "FB", "H", "EC"},
    9: {"GB", "ED", "CF", "FC", "I", "HA", "BG", "DE", "AH"},
    10: {"DF", "AI", "FD", "J", "GC", "CG", "IA", "BH", "HB", "EE"},
    20: {"JJ", "K"},
    30: {"JK", "KJ", "L"},
    40: {"M", "JL", "KK", "LJ"},
    50: {"JM", "KL", "MJ", "LK", "N"},
    60: {"JN", "NJ", "MK", "KM", "LL", "O"},
    70: {"OJ", "JO", "LM", "P", "NK", "KN", "ML"},
    80: {"PJ", "LN", "OK", "KO", "Q", "NL", "MM", "JP"},
    90: {"OL", "QJ", "KP", "LO", "JQ", "MN", "R", "PK", "NM"},
    100: {"PL", "RJ", "NN", "JR", "QK", "S", "LP", "KQ", "MO", "OM"},
    200: {"SS", "T"},
    300: {"TS", "ST", "U"},
    400: {"TT", "SU", "US", "V"},
    500: {"W", "UT", "VS", "TU", "SV"},
    600: {"SW", "VT", "X", "WS", "TV", "UU"},
    700: {"XS", "Y", "SX", "TW", "WT", "VU", "UV"},
    800: {"TX", "Z", "SY", "XT", "UW", "YS", "WU", "VV"},
    1: {"A"},
}
解决方案

原元组去重逻辑的核心是排序统一重复项的格式,再用集合去重,我们可以把这个逻辑迁移到字符串处理上:

  1. 对每个字符串,生成一个“标准化标识”:将字符串的字符排序后拼接,这样反向字符串(如AB和BA)会得到相同的标识。
  2. 用字典记录每个标识对应的原始字符串,确保每个标识只保留一个实例。
  3. 替换原字典中每个键对应的集合为去重后的结果。

完整代码实现:

original_dict = {
    2: {"B", "AA"},
    3: {"C", "BA", "AB"},
    4: {"D", "BB", "CA", "AC"},
    5: {"AD", "E", "CB", "DA", "BC"},
    6: {"CC", "F", "EA", "DB", "AE", "BD"},
    7: {"G", "CD", "DC", "AF", "FA", "BE", "EB"},
    8: {"CE", "AG", "DD", "BF", "GA", "FB", "H", "EC"},
    9: {"GB", "ED", "CF", "FC", "I", "HA", "BG", "DE", "AH"},
    10: {"DF", "AI", "FD", "J", "GC", "CG", "IA", "BH", "HB", "EE"},
    20: {"JJ", "K"},
    30: {"JK", "KJ", "L"},
    40: {"M", "JL", "KK", "LJ"},
    50: {"JM", "KL", "MJ", "LK", "N"},
    60: {"JN", "NJ", "MK", "KM", "LL", "O"},
    70: {"OJ", "JO", "LM", "P", "NK", "KN", "ML"},
    80: {"PJ", "LN", "OK", "KO", "Q", "NL", "MM", "JP"},
    90: {"OL", "QJ", "KP", "LO", "JQ", "MN", "R", "PK", "NM"},
    100: {"PL", "RJ", "NN", "JR", "QK", "S", "LP", "KQ", "MO", "OM"},
    200: {"SS", "T"},
    300: {"TS", "ST", "U"},
    400: {"TT", "SU", "US", "V"},
    500: {"W", "UT", "VS", "TU", "SV"},
    600: {"SW", "VT", "X", "WS", "TV", "UU"},
    700: {"XS", "Y", "SX", "TW", "WT", "VU", "UV"},
    800: {"TX", "Z", "SY", "XT", "UW", "YS", "WU", "VV"},
    1: {"A"},
}

processed_dict = {}
for key, str_set in original_dict.items():
    unique_map = {}
    for s in str_set:
        # 生成标准化键:排序字符后拼接
        norm_key = ''.join(sorted(s))
        # 仅保留首次出现的字符串
        if norm_key not in unique_map:
            unique_map[norm_key] = s
    # 转换为集合并保存
    processed_dict[key] = set(unique_map.values())

# 输出处理后的结果(按键排序方便查看)
for k in sorted(processed_dict.keys()):
    print(f"{k}: {processed_dict[k]}")
说明
  • 标准化处理:''.join(sorted(s))将字符串字符排序,例如"BA"和"AB"都会转为"AB",让反向重复项拥有相同的标识。
  • 去重逻辑:字典unique_map确保每个标准化标识只对应一个原始字符串,避免重复。
  • 结果保留:最终将去重后的字符串转为集合,保持原数据类型的特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:03:22