Python列表双向差异提取:如何优化嵌套循环实现?
优化列表差集的实现方式
你原来的嵌套循环逻辑存在问题——只要P里的元素和S里某一个元素不等就添加,会导致同一个元素被重复加入CListaServiceID多次(比如P里的元素如果不在S里,会被添加len(S)次),而且嵌套循环的时间复杂度是O(n*m),数据量大的时候效率极低。
用Python的**集合(set)**来处理是最优解,集合天然支持快速的成员检查和差集运算,代码简洁且效率高:
具体实现
把原来的嵌套循环部分替换成下面的代码:
# 转换为集合,利用集合的差集特性 p_set = set(PListaServiceID) s_set = set(SListaServiceID) # 仅存在于PListaServiceID但不存在于SListaServiceID的元素 CListaServiceID = list(p_set - s_set) # 仅存在于SListaServiceID但不存在于PListaServiceID的元素 C2ListaServiceID = list(s_set - p_set)
为什么这样更好
- 效率更高:集合的成员查找是
O(1)时间复杂度,差集操作的时间复杂度是O(n+m),远优于嵌套循环的O(n*m),元素越多优势越明显 - 逻辑准确:不会出现重复添加元素的问题,每个符合条件的元素只会出现在结果列表一次
- 代码简洁:不用写多层循环,一行代码就能得到差集结果
修改后的关键代码片段
writer = pd.ExcelWriter("tabella.xlsx", engine="xlsxwriter") CreateExcel(PListaServiceName,PListaServiceID, NomePrimoMese, writer) CreateExcel(SListaServiceName,SListaServiceID, NomeSecondoMese, writer) # 替换原来的嵌套循环,用集合求差集 p_set = set(PListaServiceID) s_set = set(SListaServiceID) CListaServiceID = list(p_set - s_set) C2ListaServiceID = list(s_set - p_set) # 按需求写入差集数据到Excel CreateExcel(CListaServiceID, [], "仅在P中存在的服务ID", writer) CreateExcel(C2ListaServiceID, [], "仅在S中存在的服务ID", writer) writer.close()
内容的提问来源于stack exchange,提问作者MiusiZ
相关产品推荐
相关产品推荐

