如何在Python中遍历JSON元素并分组查找匹配名称?
Python实现跨组名称组合匹配并按长度分类
实现思路
- 将每个分组的名称列表转为集合,利用集合交集操作快速定位共有名称
- 遍历所有分组对,提取它们的共有名称集合
- 从共有名称中生成所有长度≥2的组合(可自定义最小长度)
- 记录每个组合对应的所有分组并去重
- 按组合长度对最终结果分类整理
完整代码实现
import json import itertools # 加载JSON数据(可替换为从文件读取:with open('data.json') as f: data = json.load(f)) json_data = ''' [ { "group": 1, "names": [ "Bob", "John", "Alex", "Jacob", "Theo", "Thomas", "Max" ], "status": "none" }, { "group": 2, "names": [ "Martin", "Bryan", "Alex", "Adam", "Arlo", "Luca", "Ellis" ], "status": "In Progress" }, { "group": 3, "names": [ "Alex", "John", "Emma", "Toby", "Ryan", "Leon", "Blake" ], "status": "Completed" }, { "group": 4, "names": [ "John", "Martin", "Liam", "Felix", "Finn", "Ollie", "Elliot" ], "status": "In Progress" }, { "group": 5, "names": [ "Luke", "Emma", "Alex", "Arlo", "Finn", "Bob", "Theo" ], "status": "In Progress" } ] ''' # 解析数据并为每个分组生成名称集合 groups = json.loads(json_data) for g in groups: g['names_set'] = set(g['names']) # 存储组合对应的分组:键为排序后的名称元组(确保去重),值为分组ID列表 combo_map = {} # 遍历所有两两分组的组合 for g1, g2 in itertools.combinations(groups, 2): common_names = g1['names_set'] & g2['names_set'] if len(common_names) < 2: continue # 跳过不足2个名称的交集 # 生成所有符合长度要求的名称组合 for combo_len in range(2, len(common_names)+1): for combo in itertools.combinations(sorted(common_names), combo_len): # 初始化组合对应的分组列表 if combo not in combo_map: combo_map[combo] = [] # 添加分组ID(去重) if g1['group'] not in combo_map[combo]: combo_map[combo].append(g1['group']) if g2['group'] not in combo_map[combo]: combo_map[combo].append(g2['group']) # 按组合长度分类结果 result_by_length = {} for combo, group_ids in combo_map.items(): length = len(combo) if length not in result_by_length: result_by_length[length] = [] result_by_length[length].append({ "name_combo": list(combo), "groups": sorted(group_ids) }) # 打印分类后的结果 for length, items in sorted(result_by_length.items()): print(f"\n===== 长度为{length}的名称组合 =====") for item in items: print(f"组合: {item['name_combo']} | 包含分组: {item['groups']}")
代码说明
- 集合转换:将名称列表转为集合,大幅提升交集计算效率
- 组合生成:用
itertools.combinations生成所有可能的分组对和名称组合,避免重复遍历 - 去重处理:用排序后的元组作为字典键,确保相同名称组合(无关顺序)只被记录一次
- 结果分类:按组合长度整理结果,便于快速查看不同规模的匹配组合
示例输出
===== 长度为2的名称组合 ===== 组合: ['Alex', 'Bob'] | 包含分组: [1, 5] 组合: ['Alex', 'Theo'] | 包含分组: [1, 5] 组合: ['Bob', 'Theo'] | 包含分组: [1, 5] 组合: ['Alex', 'John'] | 包含分组: [1, 3] 组合: ['Alex', 'Martin'] | 包含分组: [2, 4] 组合: ['John', 'Martin'] | 包含分组: [3, 4] ===== 长度为3的名称组合 ===== 组合: ['Alex', 'Bob', 'Theo'] | 包含分组: [1, 5]
内容的提问来源于stack exchange,提问作者linasster
相关产品推荐
相关产品推荐

