如何检测字典键是否存在于其他键的集合值中并合并对应值?
字典集合值的合并实现方案
需求说明
给定一个值为集合类型的字典,若某个键k存在于另一个键m对应的集合中,则将k的集合值合并到m的集合里;若合并后产生新的包含关系,需重复此操作直到没有可合并的情况。
比如原字典:
{'0': {'3', '1', '0'}, '3': {'3', '1', '4'}, '1': {'2', '1', '0'}, '5': {'3', '5'}}
处理后得到:
{0: {0, 1, 2, 3, 4}, 1: {0, 1, 2, 3}, 3: {0, 1, 2, 3, 4}, 5: {1, 3, 4, 5}}
实现代码
def merge_dict_sets(input_dict): # 复制原字典,避免修改原始数据 merged_dict = {k: v.copy() for k, v in input_dict.items()} changed = True # 循环处理直到没有合并操作发生(处理连锁包含关系) while changed: changed = False # 提前获取当前所有键的列表,防止循环中字典结构变化引发异常 current_keys = list(merged_dict.keys()) for key in current_keys: for other_key in current_keys: if key == other_key: continue # 检查当前键是否在另一个键的集合中,且未完全合并 if key in merged_dict[other_key] and not merged_dict[key].issubset(merged_dict[other_key]): merged_dict[other_key].update(merged_dict[key]) changed = True # 可选:将字符串键转为整数(匹配示例输出格式) return {int(k): v for k, v in merged_dict.items()} # 测试示例 original = {'0': {'3', '1', '0'}, '3': {'3', '1', '4'}, '1': {'2', '1', '0'}, '5': {'3', '5'}} result = merge_dict_sets(original) print(result)
代码解释
- 字典复制:先复制原字典,避免修改原始输入数据。
- 循环控制:用
changed标志位判断是否需要继续循环——只要有合并操作发生,就重新遍历检查新的包含关系。 - 键列表预取:每次循环前先获取当前所有键的列表,防止遍历过程中字典结构变化导致的迭代异常。
- 合并逻辑:遍历每对不同的键,若
key存在于other_key的集合中,且key的集合未完全包含在other_key的集合里,就执行合并操作。 - 类型转换:最后可选将字符串键转为整数,匹配示例的输出格式。
内容的提问来源于stack exchange,提问作者Jonathan Zhang
相关产品推荐
相关产品推荐

