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

如何在Python中遍历JSON元素并分组查找匹配名称?

Python实现跨组名称组合匹配并按长度分类

实现思路

  1. 将每个分组的名称列表转为集合,利用集合交集操作快速定位共有名称
  2. 遍历所有分组对,提取它们的共有名称集合
  3. 从共有名称中生成所有长度≥2的组合(可自定义最小长度)
  4. 记录每个组合对应的所有分组并去重
  5. 按组合长度对最终结果分类整理

完整代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:45:30