如何高效遍历对象列表并比较所有对象的number属性?
优化对象列表number属性两两比较的性能问题
问题背景
现有对象列表定义:
obj_list = [obj1, obj2, obj3, obj4, ... ,objn]
对象构造方法:
def __init__(self, number): self.number = number
需求是找出列表中所有对象number属性两两相等的情况,原实现用嵌套循环:
for i in range(0, len(obj_list)): temp = obj_list[i] count = i + 1 for j in range(count, len(obj_list)): temp1 = obj_list[j] if temp.number == temp1.number: print("same")
但列表规模大时速度慢,以下是几种优化方案:
优化方案
1. 字典统计+组内配对(最优性能)
先遍历一次列表,用字典统计每个number对应的对象集合,之后只在有重复的number组内生成两两配对。整体时间复杂度O(n),远优于原方案的O(n²)。
代码示例:
from collections import defaultdict # 按number分组存储对象 number_groups = defaultdict(list) for obj in obj_list: number_groups[obj.number].append(obj) # 遍历所有有重复的分组,生成两两组合 for num, objs in number_groups.items(): if len(objs) >= 2: # 生成组内不重复的两两配对 for i in range(len(objs)): for j in range(i + 1, len(objs)): print(f"same: number={num},对象{objs[i]}与{objs[j]}")
2. 排序后找相邻重复(中等规模列表适用)
先按number对对象列表排序,之后遍历排序后的列表,对比相邻元素是否相等。时间复杂度由排序决定(O(n log n)),比嵌套循环高效。
代码示例:
# 按number排序对象列表 sorted_objs = sorted(obj_list, key=lambda x: x.number) # 遍历找重复项,若需完整两两配对可扩展逻辑 for i in range(1, len(sorted_objs)): if sorted_objs[i].number == sorted_objs[i-1].number: print(f"same: number={sorted_objs[i].number},对象{sorted_objs[i]}与{sorted_objs[i-1]}")
如果需要生成该number下所有两两组合,可以在找到连续重复段后,批量生成配对。
3. 集合快速判断是否存在重复(仅需判断重复时用)
如果只需要知道列表中是否存在重复的number,不需要具体配对项,用集合检测是最快的方式:
number_set = set() has_duplicate = False for obj in obj_list: if obj.number in number_set: has_duplicate = True break number_set.add(obj.number) print("存在重复number" if has_duplicate else "无重复number")
内容的提问来源于stack exchange,提问作者Erri000
相关产品推荐
相关产品推荐

