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

基于列表A重组列表B子列表元素,保持B长度不变

嵌套列表重组方案

核心要求回顾

需要在保持原B列表长度不变的前提下,重组B的子列表,使其每个子列表的元素分组和A完全一致,同时遵循两个保留规则:

  • B中所有元素均属于A某一子列表的子列表(如示例中的['g', 'h']),必须原封不动保留
  • B中所有元素在A中均为单元素子列表的子列表(如示例中的['c', 'd']),也必须原封不动保留

分步实现思路

  1. 建立元素分组映射表
    先为A创建一个字典,记录每个元素对应的A中子列表,方便快速查询元素所属分组:

    elem_to_group = {}
    for group in A:
        for elem in group:
            elem_to_group[elem] = group
    
  2. 筛选B中需保留的子列表
    遍历B的每个子列表,验证是否符合两个保留规则之一:

    • 规则一:子列表内所有元素对应的A分组完全相同
    • 规则二:子列表内每个元素在A中都是单独成子列表的(即对应A分组长度为1)
      符合条件的子列表直接保留,其余元素收集起来待处理。
  3. 重组剩余元素
    对收集到的剩余元素,按照A的分组规则重新合并:同一A分组的元素放在同一个子列表里。

  4. 合并并匹配长度
    将保留的子列表和重组后的子列表合并,调整顺序后确保总长度和原B一致(若元素数量匹配,通常刚好凑够长度;若有特殊情况,可补充拆分单元素等逻辑)。

完整代码实现

def restructure_b(A, B):
    # 构建元素到A分组的映射
    elem_group = {}
    for group in A:
        group_set = tuple(group)
        for elem in group:
            elem_group[elem] = group_set
    
    kept_sublists = []
    remaining_elements = set()
    
    # 筛选保留的子列表
    for sublist in B:
        # 检查规则一:所有元素属于A的同一分组
        first_group = elem_group[sublist[0]]
        all_same_group = all(elem_group[elem] == first_group for elem in sublist)
        # 检查规则二:每个元素在A中都是单元素分组
        all_single = all(len(elem_group[elem]) == 1 for elem in sublist)
        
        if all_same_group or all_single:
            kept_sublists.append(sublist.copy())
        else:
            remaining_elements.update(sublist)
    
    # 重组剩余元素
    new_groups = {}
    for elem in remaining_elements:
        group_key = elem_group[elem]
        if group_key not in new_groups:
            new_groups[group_key] = []
        new_groups[group_key].append(elem)
    restructured_groups = [list(g) for g in new_groups.values()]
    
    # 合并结果,确保长度匹配
    result = restructured_groups + kept_sublists
    # 若长度不匹配,可在这里补充逻辑(比如拆分单元素分组)
    assert len(result) == len(B), "重组后长度与原B不一致,请检查元素数量或调整逻辑"
    
    return result

# 测试示例
A = [['a', 'b'], ['d'], ['c'], ['e'], ['g', 'h']]
B = [['a'], ['c', 'd'], ['b', 'e'], ['g', 'h']]
print(restructure_b(A, B))

运行后会输出符合要求的结果(顺序可能略有不同,只要分组规则符合即可),比如:[['a', 'b'], ['e'], ['c', 'd'], ['g', 'h']]

内容的提问来源于stack exchange,提问作者donmoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:42:04