如何找出整数子列表中共有元素最多的列表?支持指定共有元素数
问题解决思路
你之前用set.intersection(*map(set, list))求的是所有子列表的公共元素,这和你要找的两两子列表间共有元素最多的需求不匹配,所以得到空集是正常的。要实现你的需求,需要遍历所有子列表对,计算每对的交集大小,再筛选符合条件的对子。
代码实现
1. 找出共有元素最多的子列表对
# 原始列表(注意不要用list当变量名,避免覆盖内置类型) sublists = [[3,5,9], [4,6,6], [4,7], [2,7], [2,1,4,5], [1,2,4,6], [3,3], [3,3], [3,2,1], [3,2]] # 存储所有子列表对及其交集大小 pair_intersections = [] # 遍历所有两两子列表对(避免重复比较,比如i<j) for i in range(len(sublists)): set_i = set(sublists[i]) for j in range(i+1, len(sublists)): set_j = set(sublists[j]) # 计算交集大小 common_count = len(set_i & set_j) pair_intersections.append( (common_count, sublists[i], sublists[j]) ) # 找出最大的交集元素数量 max_count = max(pair[0] for pair in pair_intersections) # 筛选出所有交集数量等于最大值的对子 max_pairs = [ (pair[1], pair[2]) for pair in pair_intersections if pair[0] == max_count ] # 输出结果 for pair in max_pairs: print(f"{pair[0]},{pair[1]}")
运行这段代码,输出就是你期望的:
[2,1,4,5],[1,2,4,6]
2. 根据指定共有元素数量返回对应子列表对
如果要指定交集大小(比如3个),只需修改筛选条件:
target_count = 3 target_pairs = [ (pair[1], pair[2]) for pair in pair_intersections if pair[0] == target_count ] print("符合指定数量的子列表对:") for pair in target_pairs: print(f"{pair[0]},{pair[1]}")
代码说明
- 用
set_i & set_j计算两个子列表的交集,len()得到共有元素数量 - 遍历用
i<j避免重复比较同一对子(比如[列表A,列表B]和[列表B,列表A]算同一个) - 把结果存储为
(交集大小, 子列表1, 子列表2)的元组,方便后续筛选
内容的提问来源于stack exchange,提问作者Lea
相关产品推荐
相关产品推荐

