我想创建一个自定义类,并使用该类的实例作为dict的键。
然后我想创建该类的其他实例,并检查所有属性是否与我作为该dict的键添加的实例相同。
我认为我在这方面失败了,因为当我尝试使用时:
if my_object in my_dict:
my_dict[my_object]['another_dict_key'].append('Found you!')
else:
my_dict.update(my_object:{'another_dict_key':[]})
我认为它永远不会在if语句中进行,因为my_object永远不会匹配作为' my_object'已经是dict键的实例,因为它们不是完全相同的实例 - 即使它们具有相同的属性 -
我在其他帖子中读到了一些关于这个以及哈希和 eq 的内容,但我仍感到困惑。我觉得也许有一种简单的方法可以做到这一点,否则我可以完全尝试另一种方法。但是想问一下。
这是对代码的更全面看法,我上面粘贴的片段只是为了解决这个问题,这里有一个更深入的看看,我想,如果这有帮助,顺便说一下:
master_dict = {}
i = 0
for order in orders:
normalized_structure = Normalized_Structure(order)
if normalized_structure in master_dict:
if 'ORD_INSTRUCTIONS' in master_dict[normalized_structure]:
master_dict[normalized_structure]['ORD_INSTRUCTIONS'].append(Normalized_Order_Instructions(order))
else:
master_dict[normalized_structure]['ORD_INSTRUCTIONS'] = Normalized_Order_Instructions(order)
else:
master_dict.update({normalized_structure:{'STRUCTURE_ID':i, 'ORD_INSTRUCTIONS':[]}})
master_dict[normalized_structure]['ORD_INSTRUCTIONS'].append(Normalized_Order_Instructions())
答案 0 :(得分:1)
我认为通常最好写出并对每个属性进行comapre,但是有20个属性你可能想要一个更灵活和简单的方法。所以对于平等检查你可以有
def __eq__(self, other):
return isinstance(other, type(self)) and all(v == getattr(other, k)
for k, v in vars(self).items())
至于散列,取决于你想采取的方法。
def __hash__(self):
result = 1
for k, v in sorted(vars(self).items()):
result = 31 * result + hash(v) # chosen prime is 31
return result
或者您可以创建每个值的元组并将其哈希。
def __hash__(self):
return hash(tuple(v for k, v in sorted(vars(self).items())))
<强>更新强>
如果您的某些属性不可删除,则可以忽略它们。
def __hash__(self):
return hash(tuple(v for k, v in sorted(vars(self).items())
if getattr(v, '__hash__') is not None))
否则采取第一种方法并处理它们如何在循环中进行哈希处理。