如何判断List2与List3的组合是否存在于List1中?求最优方案
问题需求与最优实现方案
给定数据
- List 1:
[[[160, 600], [125, 600],[120,600]], [[1003, 70], [1000, 60]], [[1003,90], [970,90],[728, 90]],[[300,250],[300,600],[300,292],[300,600]],[300, 100], [300, 250], [300, 250], [300, 250], [[728, 90], [1003, 90]], [1, 1]]
- List 2:
[125, 1000px, 1003, 300px, 300px, 300, 300, 300, 728]
- List 3:
[600, 50px, 80, 600px, 100px, 250, 250, 250, 90]
核心需求
逐一验证List2与List3对应位置的元素组成的组合(比如List2第一个元素+List3第一个元素组成[125, 600]),是否存在于List1的任意嵌套子列表中(示例里[125, 600]就存在于List1的第一个子列表内)。
最优实现思路(以Python为例)
第一步:统一数据格式
List2和List3里有些元素带px后缀,得先把这些单位去掉转成整数,不然没法和List1里的纯数字组合匹配:
def clean_value(val): if isinstance(val, str): return int(val.replace('px', '')) return val cleaned_list2 = [clean_value(item) for item in List2] cleaned_list3 = [clean_value(item) for item in List3]
第二步:提取List1里所有有效组合
List1嵌套比较深,写个递归逻辑把里面所有长度为2的数字列表都掏出来,存成集合——集合查找元素的速度远快于列表,单次查找几乎不耗时:
def extract_pairs(lst): pairs = set() for item in lst: if isinstance(item, list): # 长度为2的纯数字列表就是我们要找的目标组合 if len(item) == 2 and all(isinstance(x, int) for x in item): pairs.add(tuple(item)) # 列表不能直接存进集合,转成元组 # 遇到更深的嵌套,继续递归提取 else: pairs.update(extract_pairs(item)) return pairs list1_pairs = extract_pairs(List1)
第三步:批量验证对应组合
把处理后的List2和List3对应位置的元素凑成组合,直接查集合里有没有就行:
results = [] for x, y in zip(cleaned_list2, cleaned_list3): pair = (x, y) exists = pair in list1_pairs results.append((pair, exists)) # 输出验证结果 for pair, exists in results: print(f"组合{pair}是否存在:{'是' if exists else '否'}")
方案优势
- 高效查找:用集合存储List1的所有组合,单次查找仅需O(1)时间,整体时间复杂度为O(N+M)(N为List1总元素数,M为List2/List3的长度)。
- 兼容性强:递归提取逻辑能处理任意深度的嵌套结构,不用提前固定List1的嵌套层级。
- 格式统一:自动处理带
px单位的字符串,避免类型不匹配导致的查找失败。
内容的提问来源于stack exchange,提问作者Sudhir
相关产品推荐
相关产品推荐

