2017-02-25 76 views
0

我想創建一個自定義類並使用該類的實例作爲關鍵字的字典。檢查一個類實例(在這種情況下作爲字典密鑰)是否具有與同一類的另一個實例相同的屬性

然後,我想創建該類的其他實例,並檢查所有屬性是否與我作爲該字典的鍵添加的實例相同。

我想我在這,因爲失敗時,我嘗試使用:

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」實例已經是一個字典裏關鍵,因爲他們是不完全一樣的情況下 - 即使它們具有相同的屬性 -

我讀了關於這個其他職位有點和哈希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

[python:my classes as dict keys可能重複。如何?](http://stackoverflow.com/questions/5221236/python-my-classes-as-dict-keys-how) –

+0

嗨史蒂文,我看着,但不知道如何做到這一點,而不設置哈希/ eq精心列出每一個屬性。對於擁有20個屬性的課程,有沒有捷徑可以讓它更合理? – 10mjg

+0

我想你可以做'def __eq __(self,other):返回所有(v == getattr(other,k)for v,vars(self).items())'和類似的哈希,瞭解如何自定義哈希實現。你可能只需要一些簡單的東西。 –

回答

1

我認爲通常最好是寫出每個屬性,並設置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()))) 

更新:

如果你的一些屬性是unhashable,那麼你可以忽略它們,像這樣。

def __hash__(self): 
    return hash(tuple(v for k, v in sorted(vars(self).items()) 
         if getattr(v, '__hash__') is not None)) 

否則採取第一種方法,並處理它們如何在循環中散列。

+0

非常感謝你。現在測試。我將不得不跳過self.items()中的兩個變量,這是他們拋出不可解析錯誤的字典bc。但我知道那些提前被稱爲什麼,可以明確地跳過它們,我猜。現在測試.. – 10mjg

+0

爲不可取值更新了答案。 –

+0

我必須進行更徹底的測試(也許明天),但現在經過輕度測試,您的解決方案看起來很有效,您的解釋/提供選項非常讚賞。 – 10mjg

相關問題