2016-03-30 2 views
-1

等価性をチェックするために、同じクラスの2つのインスタンスを反復処理しています。このクラスのこれらの2つのインスタンスは、異なる方法で作成されます.1つはpickleから、もう1つはjsonドキュメントから作成されます。リスト内の大文字と小文字を無視して、タプルの両方の要素を並べ替えます。

これらのオブジェクトのプロパティを反復して、等しいかどうかをチェックしていますが、辞書のキーが常に並んでいるわけではないため、正しく比較できません。だから、私はこれらのタプルをソートしようとしましたが、大文字と小文字の区別のために、これらのオブジェクトの両方から同じキーを常に取得することはできません。

alpha VAR_THRESH 
chunksize VAR_MAXITER 
decay decay 
.... 

を出力し、私は明示的に右側のみlower()作る場合、私は反対を取得

def __eq__(self, other): 
    for (self_key, other_key) in sorted(
     zip(self.__dict__, other.__dict__), 
     key=lambda element: (element[0].lower(), element[1].lower())):    
      print self_key, " ", other_key 
     .... 

:例えば

一つの試みは私の左側にソートを与えます

.... 
    key=lambda element: (element[0], element[1].lower())): 
    .... 

左側を下にソートしません。

VAR_MAXITER alpha 
VAR_THRESH chunksize 
alpha VAR_THRESH 
chunksize VAR_MAXITER 
decay decay 

私は要素の両方に.lower()を省略した場合、私は第二の例を取得します。

正しいキーが常に並んでいることを確認するにはどうすればよいですか?つまり、どのようにしてタプル内の両方の値で並べ替えて、大文字小文字を無視することができますか?

+0

注文が無関係である、dictsが同じオブジェクトを持っている場合、彼らは私が値のいずれかが、NP配列であるため、辞書のキーを反復処理する必要が等しい –

答えて

2

zip()は、それぞれのiterableに対応する要素を与えます。どのような並べ替えzip()はあなたを助けることはありません。キーを並べ替える前に、キーをzip()に渡す必要があります。それは本当にあなたが望むものではありません。

def __eq__(self, other): 
    self.__dict__ == other.__dict__ 

ていませんが、より簡単に相当するものとして数えるものを定義するために変更することができます最初に:簡単な方法はこれだろう

def __eq__(self, other): 
    if self.__dict__.viewkeys() != other_keys.__dict__.viewkeys(): # .keys() in Python 3 
     return False 
    return all(other.__dict__[key] == self.__dict__[key] for key in self.__dict__) 

:ちょうどこれを行います。このためのショートカットです

def __eq__(self, other): 
    return all(
     sorted(v) == sorted(self.__dict__[key]) 
      if isinstance(v, np.array) 
     else self.__dict__[key] == v 
     for key, v in other.__dict__.iteritems() 
    ) 

あなたが望むものに近い(パドレイクカニンガムによって提案された)次

def __eq__(self, other): 
    for key, v in other.__dict__.iteritems(): # .items() in Python 3 
     if isinstance(v, np.array) and sorted(v) != sorted(self.__dict__[key]): 
       return False 
     elif self.__dict__[key] != v: 
      return False 
    return True 
+0

を比較します。編集前のあなたの答えは私が正解に到着するのを助けました。あなたがそれを元に戻すなら、私は受け入れます。 – nook

+0

@nook:OK;私は戻った。 – zondo

+0

''もしd2.keys()!= d1.keys() 'で十分なら、' 'd2.viewkeys()!= d1、viewkeys()' 'python2の場合は、セットを作る必要はありません –

-1

辞書は本質的に順序付けられていません。あなたの特定の定義に合った順序にキーを強制することは確かに可能ですが、まったく必要ありません。代わりに、このような何かを試みることができる:

def __eq__(self, other): 

    # first, check to make sure that the two sets of keys are identical 
    if self.__dict__.keys() != other.__dict__.keys(): 
    return False 

    # now that we know the dictionaries have identical key sets, check 
    # for equality of values. 
    for key in self.__dict__.keys(): 
    if self.__dict__[key] != other.__dict__[key]: 
     return False 

    # if everything worked, then the dictionaries are identical! 
    return True 
関連する問題