【发布时间】:2017-02-25 02:57:27
【问题描述】:
我想创建一个自定义类并使用该类的实例作为字典的键。
然后我想创建该类的其他实例,并检查所有属性是否与我作为该字典的键添加的实例相同。
我认为我在这方面失败了,因为当我尝试使用:
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 永远不会与已经是 dict 键的“my_object”实例匹配,因为它们不是完全相同的实例——即使它们具有相同的属性——
我在其他帖子中阅读了一些关于此以及 hash 和 eq 的内容,但我仍然感到困惑。我觉得也许有一种简单的方法可以做到这一点,或者我可以完全尝试另一种方法。但是想问问。
这是对代码的更全面的了解,我在上面粘贴的 sn-p 只是为了隔离问题,我想这里是更深入的了解,如果这有帮助,顺便说一句:
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())
【问题讨论】:
-
嗨史蒂文,我看过了,但我不确定如何在不设置哈希/eq 煞费苦心地列出每个属性的情况下做到这一点。对于一个有 20 个属性的类,有没有捷径可以让它更合理?
-
我猜你可以对哈希做
def __eq__(self, other): return all(v == getattr(other, k) for k, v in vars(self).items())和类似的东西,看看如何做自定义哈希实现。不过,您可能只需要一些简单的东西。 -
当您说类似/简单的哈希时,例如,甚至可能像这个答案一样返回 0?有没有像你在上面写的那样光滑的衬里,可以在散列中工作?谢谢-我是新手...stackoverflow.com/questions/4005318/how-to-implement-a-good-hash-function-in-python
标签: python dictionary attributes key instance