如何利用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"}, }
解决方案
原元组去重逻辑的核心是排序统一重复项的格式,再用集合去重,我们可以把这个逻辑迁移到字符串处理上:
- 对每个字符串,生成一个“标准化标识”:将字符串的字符排序后拼接,这样反向字符串(如
AB和BA)会得到相同的标识。 - 用字典记录每个标识对应的原始字符串,确保每个标识只保留一个实例。
- 替换原字典中每个键对应的集合为去重后的结果。
完整代码实现:
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
相关产品推荐
相关产品推荐

