[英]check if a class instance (which serves as a dict key in this case), has all the same attributes as another instance of the same class
我想創建一個自定義類,並使用該類的實例作為字典的鍵。
然后,我想創建該類的其他實例,並檢查所有屬性是否與我作為該字典的鍵添加的實例相同。
我想我失敗了,因為當我嘗試使用時:
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'實例匹配,因為它們不是完全相同的實例-即使它們具有相同的屬性-
我在其他文章中也讀到了一些有關散列和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())
我認為通常最好將每個屬性寫出來並進行比較,但要提供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))
否則,采用第一種方法並處理它們如何在循環中散列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.