嵌套列表组合高效优化:低内存满足双重条件的实现方案咨询
问题描述
我有四个嵌套列表,每个子列表长度固定为2,数据量达数百万级,示例如下:
L_1 = [[1,2], [3,4], [10,12]] L_2 = [[5,9], [0,1]] L_3 = [[3,5]] L_4 = [[4,9]]
需找出L_1与L_2的所有符合以下双重条件的组合:
- 组合后的列表中无重复值(例如
[1,2,1,9]不被接受); - 从L_1取
[A,B]、从L_2取[C,D],组合后的[A,B,C,D]需满足[A,C]存在于L_3且[B,D]存在于L_4,且保留原列表顺序。
示例中仅[3,4,5,9]符合要求。我当前的代码能得到正确结果,但内存占用极高:
df_tot = L_1.merge(L_2, how='cross') df_tot = df_tot[~df_tot.apply(lambda x: x.duplicated().any(), axis=1)] df_tot = df_tot.drop_duplicates() df = pd.merge(df_tot, L_4, on=['B','D'], how="inner") df = df.drop_duplicates() df_ACBD = pd.merge(df, L_3, on=['A','C'], how="inner") Accepted = df_ACBD.drop_duplicates()
优化方案
核心思路是避免全量交叉合并,先通过L3和L4过滤出合法的关联对,再逐步匹配L1和L2的元素,最后检查重复值,大幅减少内存占用和计算耗时。
步骤1:转换列表为结构化DataFrame
先将所有列表转换为带列名的DataFrame,方便后续关联操作:
import pandas as pd df1 = pd.DataFrame(L_1, columns=['A', 'B']) df2 = pd.DataFrame(L_2, columns=['C', 'D']) df3 = pd.DataFrame(L_3, columns=['A', 'C']) df4 = pd.DataFrame(L_4, columns=['B', 'D'])
步骤2:逐步内连接过滤合法组合
通过三次内连接,只保留满足条件2的候选组合,避免生成百万级的交叉数据:
# 关联df1与df3:只保留存在于L3的(A,C)对 df1_3 = pd.merge(df1, df3, on='A', how='inner') # 关联结果与df4:只保留存在于L4的(B,D)对 df1_3_4 = pd.merge(df1_3, df4, on='B', how='inner') # 关联结果与df2:只保留存在于L2的(C,D)对 candidates = pd.merge(df1_3_4, df2, on=['C', 'D'], how='inner')
步骤3:检查组合无重复值
此时候选集已经大幅缩小,再检查四个元素是否无重复:
# 用集合长度判断重复,比逐行检查duplicated更高效 accepted = candidates[candidates.apply(lambda x: len(set([x['A'], x['B'], x['C'], x['D']])) == 4, axis=1)] # 转换为目标列表格式 accepted_list = accepted[['A', 'B', 'C', 'D']].values.tolist()
优化说明
- 避免全量交叉:原代码的
cross merge会生成len(L1)*len(L2)条数据(数百万×数百万量级),内存直接爆炸;优化后通过内连接逐步过滤,只保留合法关联的组合,数据量骤减。 - 延迟重复检查:将重复检查放在最后,此时候选集规模很小,计算成本极低。
- 高效重复判断:用集合长度判断(固定4个元素)替代
duplicated().any(),逻辑更直接,计算更快。
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

