You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效遍历对象列表并比较所有对象的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:30:57