基于列表A重组列表B子列表元素,保持B长度不变
嵌套列表重组方案
核心要求回顾
需要在保持原B列表长度不变的前提下,重组B的子列表,使其每个子列表的元素分组和A完全一致,同时遵循两个保留规则:
- B中所有元素均属于A某一子列表的子列表(如示例中的
['g', 'h']),必须原封不动保留 - B中所有元素在A中均为单元素子列表的子列表(如示例中的
['c', 'd']),也必须原封不动保留
分步实现思路
建立元素分组映射表
先为A创建一个字典,记录每个元素对应的A中子列表,方便快速查询元素所属分组:elem_to_group = {} for group in A: for elem in group: elem_to_group[elem] = group筛选B中需保留的子列表
遍历B的每个子列表,验证是否符合两个保留规则之一:- 规则一:子列表内所有元素对应的A分组完全相同
- 规则二:子列表内每个元素在A中都是单独成子列表的(即对应A分组长度为1)
符合条件的子列表直接保留,其余元素收集起来待处理。
重组剩余元素
对收集到的剩余元素,按照A的分组规则重新合并:同一A分组的元素放在同一个子列表里。合并并匹配长度
将保留的子列表和重组后的子列表合并,调整顺序后确保总长度和原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
相关产品推荐
相关产品推荐

