Python检查对象数组中hexdigest字段重复值并记录重复对象
检查自定义对象数组中hexdigest属性的重复对象
你的原代码逻辑存在错误:内层循环里的obj.hexdigest not in jbo是判断字符串是否存在于对象实例中,这永远返回True,导致所有对象都会被加入newlist,duplist始终为空,无法实现检查重复的需求。
以下是两种可行的解决方案:
方法一:按hexdigest分组提取重复对象
通过字典将对象按hexdigest分组,之后筛选出分组长度大于1的所有对象,能一次性获取所有重复的完整对象(包括每组中第一次出现的对象)。
class customclass: def __init__(self, value, hexdigest): self.value = value self.hexdigest = hexdigest # 初始化对象数组 hash_array = [ customclass(value=299, hexdigest='927'), customclass(value=207, hexdigest='92b'), customclass(value=113, hexdigest='951'), customclass(value=187, hexdigest='951'), customclass(value=205, hexdigest='998') ] # 按hexdigest分组存储对象 digest_groups = {} for obj in hash_array: if obj.hexdigest not in digest_groups: digest_groups[obj.hexdigest] = [] digest_groups[obj.hexdigest].append(obj) # 收集所有重复的对象 duplicate_objects = [] for group in digest_groups.values(): if len(group) > 1: duplicate_objects.extend(group) # 打印结果 for obj in duplicate_objects: print(f"value: {obj.value}, hexdigest: {obj.hexdigest}")
运行后会输出两个hexdigest='951'的完整对象:
value: 113, hexdigest: 951 value: 187, hexdigest: 951
方法二:用集合跟踪已出现的hexdigest
通过集合记录已经见过的hexdigest,遍历数组时判断当前对象的hexdigest是否已存在,从而收集重复对象。如果需要包含第一次出现的重复对象,可调整逻辑用字典存储首次出现的对象。
class customclass: def __init__(self, value, hexdigest): self.value = value self.hexdigest = hexdigest hash_array = [ customclass(value=299, hexdigest='927'), customclass(value=207, hexdigest='92b'), customclass(value=113, hexdigest='951'), customclass(value=187, hexdigest='951'), customclass(value=205, hexdigest='998') ] # 仅收集后续重复出现的对象 seen_digests = set() duplicate_objects = [] for obj in hash_array: if obj.hexdigest in seen_digests: duplicate_objects.append(obj) else: seen_digests.add(obj.hexdigest) print("后续重复的对象:") for obj in duplicate_objects: print(f"value: {obj.value}, hexdigest: {obj.hexdigest}") # 若要包含第一次出现的重复对象,使用以下逻辑: seen_digests = {} full_duplicates = [] for obj in hash_array: if obj.hexdigest in seen_digests: # 首次出现的对象还没加入的话先加入 if seen_digests[obj.hexdigest] not in full_duplicates: full_duplicates.append(seen_digests[obj.hexdigest]) full_duplicates.append(obj) else: seen_digests[obj.hexdigest] = obj print("\n所有重复的对象:") for obj in full_duplicates: print(f"value: {obj.value}, hexdigest: {obj.hexdigest}")
内容的提问来源于stack exchange,提问作者Pie
相关产品推荐
相关产品推荐

