如何在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
相关产品推荐
相关产品推荐

