Python如何移除字典中顺序相反的重复键对
解决字典中逆序重复键对的去重问题
我来帮你搞定这个需求——要移除字典里那些逆序的重复键对(比如('cat', 'tiger')和('tiger', 'cat')视为同一组),核心思路是给每个键对生成一个标准化的唯一标识,让逆序的键对映射到同一个标识,这样就能轻松实现去重了。
核心实现思路
对于每个二元组形式的键,我们可以对其进行排序处理:比如把('tiger', 'cat')排序后变成('cat', 'tiger'),这样所有逆序的键对都会得到完全相同的标准化键。之后我们只需要根据这个标准化键来过滤重复项即可。
代码实现示例
场景1:保留标准化后的键(排序后的元组)
这种方式会把所有逆序键对统一成排序后的形式,值保留首次遇到的那个:
original_dict = {('cat', 'tiger'): 18, ('tiger', 'cat'): 18, ('cage', 'cat'): 5, ('cat', 'cage'): 5} unique_dict = {} for key, value in original_dict.items(): # 对键进行排序,生成唯一的标准化键 normalized_key = tuple(sorted(key)) # 仅当标准化键未出现过时,才添加到新字典 if normalized_key not in unique_dict: unique_dict[normalized_key] = value print(unique_dict) # 输出: {('cat', 'tiger'): 18, ('cage', 'cat'): 5}
场景2:保留原始键的格式(保留首次出现的原始键)
如果你想保留字典中第一次出现的原始键格式,而不是标准化后的键,可以用一个集合来记录已经处理过的标准化键:
original_dict = {('cat', 'tiger'): 18, ('tiger', 'cat'): 18, ('cage', 'cat'): 5, ('cat', 'cage'): 5} unique_dict = {} seen_keys = set() for key, value in original_dict.items(): normalized_key = tuple(sorted(key)) if normalized_key not in seen_keys: seen_keys.add(normalized_key) unique_dict[key] = value print(unique_dict) # 输出: {('cat', 'tiger'): 18, ('cage', 'cat'): 5}
场景3:合并重复键对的值(比如求和)
如果你的需求不是移除重复项,而是合并它们的值(比如把重复键对的数值相加),可以调整逻辑如下:
original_dict = {('cat', 'tiger'): 18, ('tiger', 'cat'): 18, ('cage', 'cat'): 5, ('cat', 'cage'): 5} merged_dict = {} for key, value in original_dict.items(): normalized_key = tuple(sorted(key)) # 如果标准化键已存在,就合并值;否则添加新条目 if normalized_key in merged_dict: merged_dict[normalized_key] += value # 这里可以换成max()、min()等其他合并逻辑 else: merged_dict[normalized_key] = value print(merged_dict) # 输出: {('cat', 'tiger'): 36, ('cage', 'cat'): 10}
适配性说明
这种方法完全适配所有逆序键对的场景,不管你的字典键是像('cage', 'cat')这样的字符串二元组,还是其他可排序类型的二元组(比如数字元组),都能正常工作。
内容的提问来源于stack exchange,提问作者TiShow
相关产品推荐
相关产品推荐

