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

如何在Python中筛选出ledId重复的CustomObject对象列表?

Python中筛选出ledId重复的CustomObject实例列表

问题背景

我有一个自定义类CustomObject的实例列表,想要生成一个新列表,包含所有ledId出现多次的对象(即基于ledId的重复对象列表)。

自定义类代码:

class CustomObject:
    def __init__(self, id, ledId):
        self.id = id
        self.ledId = ledId

我平时使用C#,会用如下方式实现:

var subList = myList.Where(obj => myList.Count(l => l.ledId == obj.ledId) > 1)
                     .ToList();

想知道Python中是否有简便的实现方法?


实现方法

方法一:先统计频次再筛选(高效推荐)

先遍历一次列表统计每个ledId的出现次数,再遍历一次筛选出频次大于1的对象,时间复杂度为O(n),比C#嵌套遍历的O(n²)更高效,适合大多数场景:

from collections import defaultdict

# 假设myList是你的CustomObject实例列表
led_id_counts = defaultdict(int)
for obj in myList:
    led_id_counts[obj.ledId] += 1

# 生成目标列表
sub_list = [obj for obj in myList if led_id_counts[obj.ledId] > 1]

如果不想引入defaultdict,用普通字典也能实现:

led_id_counts = {}
for obj in myList:
    led_id_counts[obj.ledId] = led_id_counts.get(obj.ledId, 0) + 1

sub_list = [obj for obj in myList if led_id_counts[obj.ledId] > 1]

方法二:模拟C#逻辑(直观但低效)

如果想要和C#写法逻辑更贴近,可以用嵌套列表推导式,但这种方法时间复杂度为O(n²),仅适合小列表场景:

sub_list = [obj for obj in myList if sum(1 for l in myList if l.ledId == obj.ledId) > 1]

方法三:用pandas处理(大数据量场景)

如果你的数据量很大,或者已经在使用pandas,可以将对象列表转为DataFrame后筛选:

import pandas as pd

# 将对象转为DataFrame
df = pd.DataFrame([(obj.id, obj.ledId) for obj in myList], columns=['id', 'ledId'])
# 获取所有重复的ledId
duplicate_led_ids = df[df.duplicated('ledId', keep=False)]['ledId'].unique()
# 筛选对应对象
sub_list = [obj for obj in myList if obj.ledId in duplicate_led_ids]

内容的提问来源于stack exchange,提问作者primmslim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:25:01