合并嵌套列表中的重复项技术问询
元组列表前缀重复项合并去重实现方案
需求说明
给定列表:
[('John', 'Johns', 'Jonh'), ('Mark', 'Marke', 'Marken'), ('John', 'Johns', 'Jonh','Johna'), ('James', 'Jame')]
需要移除作为其他元组前缀的短元组,保留包含完整内容的长元组,最终得到:
[('Mark', 'Marke', 'Marken'), ('John', 'Johns', 'Jonh','Johna'), ('James', 'Jame')]
实现方案
方案一:全局前缀检查(通用场景)
核心思路是优先保留长元组,再过滤掉所有是已有长元组前缀的短元组,步骤如下:
- 按元组长度降序排序,确保长元组先被处理
- 遍历排序后的元组,仅保留那些不是结果列表中任意元组前缀的项
- 可选:恢复原列表中非重复项的相对顺序
代码实现:
original_list = [('John', 'Johns', 'Jonh'), ('Mark', 'Marke', 'Marken'), ('John', 'Johns', 'Jonh','Johna'), ('James', 'Jame')] # 按长度降序排序,长元组优先 sorted_items = sorted(original_list, key=lambda x: len(x), reverse=True) final_result = [] for item in sorted_items: # 检查当前元组是否是结果中任意元组的前缀,不是则加入 if not any(res[:len(item)] == item for res in final_result): final_result.append(item) # 恢复原列表的元素顺序(可选) final_result = sorted(final_result, key=lambda x: original_list.index(x)) print(final_result)
方案二:分组保留最长元组(已知重复项按首元素分组场景)
如果能确定重复元组的首元素相同,可以按首元素分组,每组直接保留最长元组,效率更高:
from collections import defaultdict original_list = [('John', 'Johns', 'Jonh'), ('Mark', 'Marke', 'Marken'), ('John', 'Johns', 'Jonh','Johna'), ('James', 'Jame')] # 按元组首元素分组 grouped = defaultdict(list) for tpl in original_list: grouped[tpl[0]].append(tpl) final_result = [] for group in grouped.values(): # 每组取最长的元组 longest_tpl = max(group, key=lambda x: len(x)) final_result.append(longest_tpl) # 恢复原列表的元素顺序(可选) final_result = sorted(final_result, key=lambda x: original_list.index(x)) print(final_result)
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

