簡體   English   中英

檢查一個類實例(在這種情況下用作字典鍵)是否具有與同一類的另一個實例相同的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM