2つの辞書を比較し、等しい(キー、値)ペアの数を確認する


246

私は2つの辞書を持っていますが、簡単にするために、次の2つを取り上げます。

>>> x = dict(a=1, b=2)
>>> y = dict(a=2, b=2)

次に、の各key, valueペアxがで同じ対応する値を持っているかどうかを比較しyます。だから私はこれを書いた:

>>> for x_values, y_values in zip(x.iteritems(), y.iteritems()):
        if x_values == y_values:
            print 'Ok', x_values, y_values
        else:
            print 'Not', x_values, y_values

そして、それはa tupleが返され、次に等しいかどうか比較されるので機能します。

私の質問:

これは正しいです?これを行うより良い方法はありますか?速度ではなく、コードの優雅さについて話しています。

更新:key, value等しいペアの数を確認する必要があることを言及するのを忘れていました。



x == yは真でなければなりません。REPLをすばやくチェックインできます。参照してください:docs.python.org/2/library/stdtypes.html#mapping-types-dict
Vikrant

回答:


179

両方の辞書で一致する値の数を知りたい場合は、次のように言ってください。

多分このようなもの:

shared_items = {k: x[k] for k in x if k in y and x[k] == y[k]}
print len(shared_items)

1
dictキーのリスト要素がある場合、同じエラーが発生します。何か不足している場合を除いて、cmpがより良い方法だと思います。
ミュータント

@ミュータントは別の問題です。listそもそもキー付きの辞書は作れません。x = {[1,2]: 2}失敗します。質問はすでに有効ですdicts
AnnanFay 2015年

@annan:間違い、質問は一般的です。例えば、問題の説明には、すでに「有効dicts」を持っています。タイトルが同じで「無効な」辞書が異なる新しい質問を投稿すると、誰かが重複としてマークします。反対投票。
ribamar

6
@ribamar問題は「2つの辞書を比較する[...]」です。上記の「無効なdict」とlistキーは無効なpythonコードです-dict キーは不変でなければなりません。したがって、辞書を比較していません。リストを辞書キーとして使用しようとすると、コードは実行されません。比較するオブジェクトがありません。これは、タイプしてx = dict(23\;dfg&^*$^%$^$%^)から、比較がディクショナリで機能しないことを報告するようなものです。もちろん動作しません。一方、ティムのコメントは可変valuesであり、それゆえ私はこれらが異なる問題であると私が言った理由です。
AnnanFay

1
@MikeyE- set値はハッシュ可能であるdict必要があり、キーはハッシュ可能である必要があります。 set(x.keys())キーはハッシュ可能である必要があるため、常にset(x.values())機能しますが、ハッシュ可能でない値では失敗します。
Tim Tisdall 2017

173

あなたがしたいことは単に x==y

辞書内のアイテムは順序付けされていないため、何をするかはお勧めできません。あなたは(同じ辞書、異なる順序)と比較[('a',1),('b',1)]しているかもしれません[('b',1), ('a',1)]

たとえば、これを見てください:

>>> x = dict(a=2, b=2,c=3, d=4)
>>> x
{'a': 2, 'c': 3, 'b': 2, 'd': 4}
>>> y = dict(b=2,c=3, d=4)
>>> y
{'c': 3, 'b': 2, 'd': 4}
>>> zip(x.iteritems(), y.iteritems())
[(('a', 2), ('c', 3)), (('c', 3), ('b', 2)), (('b', 2), ('d', 4))]

違いは1つのアイテムだけですが、アルゴリズムではすべてのアイテムが異なることがわかります


@ THC4k、言及しなくて申し訳ありません。ただし、両方の辞書で一致する値の数を確認する必要があります。
user225312 2010

わかりましたので、私の更新に基づいて、私のやり方はまだ間違っていますか?
user225312 2010

@AA:カウントしたいのに機能しない理由を追加しました。
Jochen Ritzel、2010

わかりましたが、私の場合、両方の辞書は同じ長さです。そして、それはプログラムがどのように機能するかということなので、常にそうです。
user225312 2010

5
Python 3.6の時点で、dictは標準で注文されています。
Phil

163
def dict_compare(d1, d2):
    d1_keys = set(d1.keys())
    d2_keys = set(d2.keys())
    shared_keys = d1_keys.intersection(d2_keys)
    added = d1_keys - d2_keys
    removed = d2_keys - d1_keys
    modified = {o : (d1[o], d2[o]) for o in shared_keys if d1[o] != d2[o]}
    same = set(o for o in shared_keys if d1[o] == d2[o])
    return added, removed, modified, same

x = dict(a=1, b=2)
y = dict(a=2, b=2)
added, removed, modified, same = dict_compare(x, y)

7
これは実際、dict内の可変値を処理します!
Tim Tisdall、2015

1
これを実行しても、変更可能な値の処理に関するエラーが発生します。ValueError:DataFrameの真の値があいまいです。a.empty、a.bool()、a.item()、a.any()またはa.all()を使用します。
Afflatus

2
@Afflatus- DataFrame設計上、から継承するため、真の長さの比較は許可されません(長さが1でない限り)numpy.ndarray。-クレジットへstackoverflow.com/a/33307396/994076
ダニエル・マイヤーズ

これは絶対的な逸品です。
pfabri

125

dic1 == dic2

python docsから:

説明するために、以下の例では、すべての辞書戻る等しいを するには {"one": 1, "two": 2, "three": 3}

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True

最初の例のようにキーワード引数を指定すると、有効なPython識別子であるキーに対してのみ機能します。それ以外の場合は、有効なキーを使用できます。

両方の有効なpy2py3


3
@ErkinAlpGüneyに同意しません。証拠を提示していただけませんか?
Qi Luo

4
@ErkinAlpGüneyに同意しません。公式のドキュメントは、==が実際にアドレスではなく値で辞書を比較することを示しています。docs.python.org/2/library/stdtypes.html#mapping-types-dict
Matthew Nakayama

3
Works for Python 2.7.13
Jesuisme

4
@ankostis:OrderedDict != dict
CONvid19 2018年

3
これが真実ではない入力を提供できますか?
CONvid19

55

私はPythonが初めてですが、@ mouadのようなものをやった

unmatched_item = set(dict_1.items()) ^ set(dict_2.items())
len(unmatched_item) # should be 0

XOR演算子(^)は、両方の辞書で同じである場合、辞書のすべての要素を削除する必要があります。


28
残念ながら、dictの値が変更可能(つまりハッシュ可能でない)の場合、これは機能しません。(元{'a':{'b':1}}は与えるTypeError: unhashable type: 'dict'
Tim Tisdall 2015

54

誰も言及していないようですのでdeepdiff、完全を期すためにここに追加します。(ネストされた)オブジェクトのdiffを取得するのに非常に便利です。

取り付け

pip install deepdiff

サンプルコード

import deepdiff
import json

dict_1 = {
    "a": 1,
    "nested": {
        "b": 1,
    }
}

dict_2 = {
    "a": 2,
    "nested": {
        "b": 2,
    }
}

diff = deepdiff.DeepDiff(dict_1, dict_2)
print(json.dumps(diff, indent=4))

出力

{
    "values_changed": {
        "root['a']": {
            "new_value": 2,
            "old_value": 1
        },
        "root['nested']['b']": {
            "new_value": 2,
            "old_value": 1
        }
    }
}

検査のために結果をプリティプリントすることに関する注意:上記のコードは、両方のディクテーションが同じ属性キーを持っている場合に機能します(例のように属性値が異なる可能性があります)。ただし、"extra"属性が存在する場合は、dictsの1つであり、json.dumps()失敗します

TypeError: Object of type PrettyOrderedSet is not JSON serializable

解決策:diff.to_json()およびjson.loads()/ json.dumps()を使用してプリティプリントします。

import deepdiff
import json

dict_1 = {
    "a": 1,
    "nested": {
        "b": 1,
    },
    "extra": 3
}

dict_2 = {
    "a": 2,
    "nested": {
        "b": 2,
    }
}

diff = deepdiff.DeepDiff(dict_1, dict_2)
print(json.dumps(json.loads(diff.to_json()), indent=4))  

出力:

{
    "dictionary_item_removed": [
        "root['extra']"
    ],
    "values_changed": {
        "root['a']": {
            "new_value": 2,
            "old_value": 1
        },
        "root['nested']['b']": {
            "new_value": 2,
            "old_value": 1
        }
    }
}

別の方法:を使用するpprintと、異なるフォーマットになります:

import pprint

# same code as above

pprint.pprint(diff, indent=4)

出力:

{   'dictionary_item_removed': [root['extra']],
    'values_changed': {   "root['a']": {   'new_value': 2,
                                           'old_value': 1},
                          "root['nested']['b']": {   'new_value': 2,
                                                     'old_value': 1}}}

2
面白い。これに答えてくれてありがとう。少なくとも私には便利です。この回答にはもっと賛成票が必要です。
Archit Kapoor 2018

46

ただ使う:

assert cmp(dict1, dict2) == 0

6
両方の内容が同じであるかどうかを確認するだけでなく、違いのレポートを提供することもタスクのようです
Diego

29
これは同じだと思いますdict1 == dict2
Trey Hunner、2015年

10
Python3.5を使用して、誰のために、cmp内蔵のは削除されました(ととして扱われるべきである前に除去し、彼らが提案する代替:。(a > b) - (a < b) == cmp(a, b)機能的同等(またはより良い__eq____hash__)を
nerdwaller

3
@nerdwaller-dictsは順序付け可能な型ではないため、dict_a> dict_bはaを発生させTypeErrorます:unorderable types: dict() < dict()
Stefano

2
@Stefano:いいね、私のコメントはpythonでの一般的な比較のためのものでした(実際の答え、私の間違いに注意を向けていませんでした)。
nerdwaller

9

@mouadの答えは、両方の辞書に単純な値のみが含まれていると仮定する場合に適しています。ただし、辞書を含む辞書がある場合、辞書はハッシュ化できないため、例外が発生します。

私の頭の上で、このようなものがうまくいくかもしれません:

def compare_dictionaries(dict1, dict2):
     if dict1 is None or dict2 is None:
        print('Nones')
        return False

     if (not isinstance(dict1, dict)) or (not isinstance(dict2, dict)):
        print('Not dict')
        return False

     shared_keys = set(dict1.keys()) & set(dict2.keys())

     if not ( len(shared_keys) == len(dict1.keys()) and len(shared_keys) == len(dict2.keys())):
        print('Not all keys are shared')
        return False


     dicts_are_equal = True
     for key in dict1.keys():
         if isinstance(dict1[key], dict) or isinstance(dict2[key], dict):
             dicts_are_equal = dicts_are_equal and compare_dictionaries(dict1[key], dict2[key])
         else:
             dicts_are_equal = dicts_are_equal and all(atleast_1d(dict1[key] == dict2[key]))

     return dicts_are_equal

not isinstance(dict1, dict)代わりにを使用するとtype(dict1) is not dict、これはdict. Also, instead of (dict1 [key] == dict2 [key]), you can do all(atleast_1d(dict1 [key] == dict2 [key])) `に基づく他のクラスで機能し、少なくとも配列を処理します。
EL_DON 2018年

+1、しかしあなたはfor loopあなたdicts_are_equalが偽になるとすぐにあなたから抜け出すことができます。これ以上続ける必要はありません。
pfabri

6

さらに別の可能性は、OPの最後のメモまで、JSONとしてダンプされたディクテーションのハッシュ(SHAまたはMD)を比較することです。ハッシュの構築方法は、ハッシュが等しい場合、ソース文字列も等しいことを保証します。これは非常に高速で、数学的に健全です。

import json
import hashlib

def hash_dict(d):
    return hashlib.sha1(json.dumps(d, sort_keys=True)).hexdigest()

x = dict(a=1, b=2)
y = dict(a=2, b=2)
z = dict(a=1, b=2)

print(hash_dict(x) == hash_dict(y))
print(hash_dict(x) == hash_dict(z))

2
それは完全に間違っています。データをjsonに解析するだけでは本当に遅いです。次に、あなたが作成した巨大なsringをハッシュすることはさらに悪いことです。あなたは決してそれをすべきではありません
Bruno

7
@Bruno:OPの引用:「速度の方が良くない、私はコードの優雅さについて話している」
WoJ

2
それはまったくエレガントではなく、安全ではないように感じられ、本当に単純な問題のために過度に複雑です
Bruno

7
@ブルーノ:エレガンスは主観的です。あなたはそれが好きではない(そしておそらく反対投票されている)ことを理解できます。これは「間違った」と同じではありません。
WoJ

4
これは素晴らしい答えです。json.dumps(d, sort_keys=True)正規のJSONが提供されるので、両方の辞書が同等であることを確認できます。また、達成しようとしていることにも依存します。値がJSONでシリアライズ可能ではなくなるとすぐに失敗します。このように非効率であると言う人のために、ujsonプロジェクトを見てください。
Natim、2016年

6

機能は細かいIMOで、明確で直感的です。しかし、あなたに(別の)答えを与えるために、これが私の行くところです:

def compare_dict(dict1, dict2):
    for x1 in dict1.keys():
        z = dict1.get(x1) == dict2.get(x1)
        if not z:
            print('key', x1)
            print('value A', dict1.get(x1), '\nvalue B', dict2.get(x1))
            print('-----\n')

あなたや他の誰にとっても役立つことができます。

編集:

上記の再帰バージョンを作成しました。他の回答ではそれを見たことはありません

def compare_dict(a, b):
    # Compared two dictionaries..
    # Posts things that are not equal..
    res_compare = []
    for k in set(list(a.keys()) + list(b.keys())):
        if isinstance(a[k], dict):
            z0 = compare_dict(a[k], b[k])
        else:
            z0 = a[k] == b[k]

        z0_bool = np.all(z0)
        res_compare.append(z0_bool)
        if not z0_bool:
            print(k, a[k], b[k])
    return np.all(res_compare)

2
双方向に機能するように改善しましょう。2行目:「for x1 in set(dict1.keys())。union(dict2.keys()):」
nkadwa

@nkadwaに感謝します。今すぐ機能します
zwep '20

5

キーと値が2つの辞書が等しいかどうかをテストするには:

def dicts_equal(d1,d2):
    """ return True if all keys and values are the same """
    return all(k in d2 and d1[k] == d2[k]
               for k in d1) \
        and all(k in d1 and d1[k] == d2[k]
               for k in d2)

異なる値を返す場合は、別の方法で記述します。

def dict1_minus_d2(d1, d2):
    """ return the subset of d1 where the keys don't exist in d2 or
        the values in d2 are different, as a dict """
    return {k,v for k,v in d1.items() if k in d2 and v == d2[k]}

あなたはそれを2回呼び出す必要があります、すなわち

dict1_minus_d2(d1,d2).extend(dict1_minus_d2(d2,d1))

3

コード

def equal(a, b):
    type_a = type(a)
    type_b = type(b)
    
    if type_a != type_b:
        return False
    
    if isinstance(a, dict):
        if len(a) != len(b):
            return False
        for key in a:
            if key not in b:
                return False
            if not equal(a[key], b[key]):
                return False
        return True

    elif isinstance(a, list):
        if len(a) != len(b):
            return False
        while len(a):
            x = a.pop()
            index = indexof(x, b)
            if index == -1:
                return False
            del b[index]
        return True
        
    else:
        return a == b

def indexof(x, a):
    for i in range(len(a)):
        if equal(x, a[i]):
            return i
    return -1

テスト

>>> a = {
    'number': 1,
    'list': ['one', 'two']
}
>>> b = {
    'list': ['two', 'one'],
    'number': 1
}
>>> equal(a, b)
True

3

==との単純な比較で、現在は十分です(python 3.8)。同じ辞書を異なる順序で比較する場合でも(最後の例)。最良のことは、これを実現するためにサードパーティのパッケージを必要としないことです。

a = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}
b = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}

c = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}
d = {'one': 'dog', 'two': 'cat', 'three': 'mouse', 'four': 'fish'}

e = {'one': 'cat', 'two': 'dog', 'three': 'mouse'}
f = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}

g = {'two': 'cat', 'one': 'dog', 'three': 'mouse'}
h = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}


print(a == b) # True
print(c == d) # False
print(e == f) # False
print(g == h) # True

2

私の返答が遅れることは決してないよりはましです!

Compare Not_Equalは、Equalを比較するよりも効率的です。そのため、一方の辞書のキー値がもう一方の辞書に見つからない場合、2つの辞書は等しくありません。以下のコードは、デフォルトの辞書を比較する可能性があるため、getitem [] ではなくgetを使用することを考慮しています。

取得するキーと等しいget呼び出しで、一種のランダムな値をデフォルトとして使用します-dictが一方のdictに値としてNoneを持ち、そのキーがもう一方に存在しない場合に備えて。また、get!=条件は、効率を上げるためにnot in条件の前にチェックされます。これは、両側のキーと値を同時にチェックしているためです。

def Dicts_Not_Equal(first,second):
    """ return True if both do not have same length or if any keys and values are not the same """
    if len(first) == len(second): 
        for k in first:
            if first.get(k) != second.get(k,k) or k not in second: return (True)
        for k in second:         
            if first.get(k,k) != second.get(k) or k not in first: return (True)
        return (False)   
    return (True)

2

私はPython 3で完璧に機能するこのソリューションを使用しています


import logging
log = logging.getLogger(__name__)

...

    def deep_compare(self,left, right, level=0):
        if type(left) != type(right):
            log.info("Exit 1 - Different types")
            return False

        elif type(left) is dict:
            # Dict comparison
            for key in left:
                if key not in right:
                    log.info("Exit 2 - missing {} in right".format(key))
                    return False
                else:
                    if not deep_compare(left[str(key)], right[str(key)], level +1 ):
                        log.info("Exit 3 - different children")
                        return False
            return True
        elif type(left) is list:
            # List comparison
            for key in left:
                if key not in right:
                    log.info("Exit 4 - missing {} in right".format(key))
                    return False
                else:
                    if not deep_compare(left[left.index(key)], right[right.index(key)], level +1 ):
                        log.info("Exit 5 - different children")
                        return False
            return True
        else:
            # Other comparison
            return left == right

        return False

これは、dict、list、および「==」演算子を単独で実装するその他のタイプを比較します。別の何かを比較する必要がある場合は、「ifツリー」に新しいブランチを追加する必要があります。

お役に立てば幸いです。


2

python3の場合:

data_set_a = dict_a.items()
data_set_b = dict_b.items()

difference_set = data_set_a ^ data_set_b

1
>>> hash_1
{'a': 'foo', 'b': 'bar'}
>>> hash_2
{'a': 'foo', 'b': 'bar'}
>>> set_1 = set (hash_1.iteritems())
>>> set_1
set([('a', 'foo'), ('b', 'bar')])
>>> set_2 = set (hash_2.iteritems())
>>> set_2
set([('a', 'foo'), ('b', 'bar')])
>>> len (set_1.difference(set_2))
0
>>> if (len(set_1.difference(set_2)) | len(set_2.difference(set_1))) == False:
...    print "The two hashes match."
...
The two hashes match.
>>> hash_2['c'] = 'baz'
>>> hash_2
{'a': 'foo', 'c': 'baz', 'b': 'bar'}
>>> if (len(set_1.difference(set_2)) | len(set_2.difference(set_1))) == False:
...     print "The two hashes match."
...
>>>
>>> hash_2.pop('c')
'baz'

ここに別のオプションがあります:

>>> id(hash_1)
140640738806240
>>> id(hash_2)
140640738994848

ご覧のとおり、2つのIDは異なります。しかし、豊富な比較演算子がうまくいくようです:

>>> hash_1 == hash_2
True
>>>
>>> hash_2
{'a': 'foo', 'b': 'bar'}
>>> set_2 = set (hash_2.iteritems())
>>> if (len(set_1.difference(set_2)) | len(set_2.difference(set_1))) == False:
...     print "The two hashes match."
...
The two hashes match.
>>>

1

PyUnitには、辞書を美しく比較するメソッドがあります。私は次の2つの辞書を使用してテストしました。

d1 = {1: "value1",
      2: [{"subKey1":"subValue1",
           "subKey2":"subValue2"}]}
d2 = {1: "value1",
      2: [{"subKey2":"subValue2",
           "subKey1": "subValue1"}]
      }


def assertDictEqual(self, d1, d2, msg=None):
        self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
        self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')

        if d1 != d2:
            standardMsg = '%s != %s' % (safe_repr(d1, True), safe_repr(d2, True))
            diff = ('\n' + '\n'.join(difflib.ndiff(
                           pprint.pformat(d1).splitlines(),
                           pprint.pformat(d2).splitlines())))
            standardMsg = self._truncateMessage(standardMsg, diff)
            self.fail(self._formatMessage(msg, standardMsg))

unittest量産コードへのインポートはお勧めしません。私の考えでは、PyUnitのソースは、本番環境で実行するために再構築できると思います。pprint辞書をどのように「きれいに印刷する」かを使用します。このコードを「本番環境対応」にするのはかなり簡単に思えます。


1

辞書ビューオブジェクトを参照してください:https : //docs.python.org/2/library/stdtypes.html#dict

このようにして、dictView1からdictView2を減算すると、dictView2とは異なるキーと値のペアのセットが返されます。

original = {'one':1,'two':2,'ACTION':'ADD'}
originalView=original.viewitems()
updatedDict = {'one':1,'two':2,'ACTION':'REPLACE'}
updatedDictView=updatedDict.viewitems()
delta=original | updatedDict
print delta
>>set([('ACTION', 'REPLACE')])

これらのディクショナリビューオブジェクトを交差、結合、差(上記を参照)、対称差できます。
いい?もっと早く?-わかりませんが、標準ライブラリの一部です-これにより、移植性が大幅に向上します


1

以下のコードは、Pythonのdictのリストを比較するのに役立ちます

def compate_generic_types(object1, object2):
    if isinstance(object1, str) and isinstance(object2, str):
        return object1 == object2
    elif isinstance(object1, unicode) and isinstance(object2, unicode):
        return object1 == object2
    elif isinstance(object1, bool) and isinstance(object2, bool):
        return object1 == object2
    elif isinstance(object1, int) and isinstance(object2, int):
        return object1 == object2
    elif isinstance(object1, float) and isinstance(object2, float):
        return object1 == object2
    elif isinstance(object1, float) and isinstance(object2, int):
        return object1 == float(object2)
    elif isinstance(object1, int) and isinstance(object2, float):
        return float(object1) == object2

    return True

def deep_list_compare(object1, object2):
    retval = True
    count = len(object1)
    object1 = sorted(object1)
    object2 = sorted(object2)
    for x in range(count):
        if isinstance(object1[x], dict) and isinstance(object2[x], dict):
            retval = deep_dict_compare(object1[x], object2[x])
            if retval is False:
                print "Unable to match [{0}] element in list".format(x)
                return False
        elif isinstance(object1[x], list) and isinstance(object2[x], list):
            retval = deep_list_compare(object1[x], object2[x])
            if retval is False:
                print "Unable to match [{0}] element in list".format(x)
                return False
        else:
            retval = compate_generic_types(object1[x], object2[x])
            if retval is False:
                print "Unable to match [{0}] element in list".format(x)
                return False

    return retval

def deep_dict_compare(object1, object2):
    retval = True

    if len(object1) != len(object2):
        return False

    for k in object1.iterkeys():
        obj1 = object1[k]
        obj2 = object2[k]
        if isinstance(obj1, list) and isinstance(obj2, list):
            retval = deep_list_compare(obj1, obj2)
            if retval is False:
                print "Unable to match [{0}]".format(k)
                return False

        elif isinstance(obj1, dict) and isinstance(obj2, dict):
            retval = deep_dict_compare(obj1, obj2)
            if retval is False:
                print "Unable to match [{0}]".format(k)
                return False
        else:
            retval = compate_generic_types(obj1, obj2)
            if retval is False:
                print "Unable to match [{0}]".format(k)
                return False

    return retval

3
Stack Overflowへようこそ!このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明コメントを混同しないようにしてください。これにより、コードと説明の両方が読みにくくなります。
Filnor 2018

1
>>> x = {'a':1,'b':2,'c':3}
>>> x
{'a': 1, 'b': 2, 'c': 3}

>>> y = {'a':2,'b':4,'c':3}
>>> y
{'a': 2, 'b': 4, 'c': 3}

METHOD 1:

>>> common_item = x.items()&y.items() #using union,x.item() 
>>> common_item
{('c', 3)}

METHOD 2:

 >>> for i in x.items():
        if i in y.items():
           print('true')
        else:
           print('false')


false
false
true

0

Python 3.6では、次のように実行できます。

if (len(dict_1)==len(dict_2): 
  for i in dict_1.items():
        ret=bool(i in dict_2.items())

dict_1のすべての項目がdict_2に存在する場合、ret変数はtrueになります


0

これが私の答えです、再調整方法を使用してください:

def dict_equals(da, db):
    if not isinstance(da, dict) or not isinstance(db, dict):
        return False
    if len(da) != len(db):
        return False
    for da_key in da:
        if da_key not in db:
            return False
        if not isinstance(db[da_key], type(da[da_key])):
            return False
        if isinstance(da[da_key], dict):
            res = dict_equals(da[da_key], db[da_key])
            if res is False:
                return False
        elif da[da_key] != db[da_key]:
            return False
    return True

a = {1:{2:3, 'name': 'cc', "dd": {3:4, 21:"nm"}}}
b = {1:{2:3, 'name': 'cc', "dd": {3:4, 21:"nm"}}}
print dict_equals(a, b)

お役に立てば幸いです。


0

1つのディクショナリを反復処理し、その過程でもう1つのディクショナリをチェックしないのはなぜですか(両方のディクショナリのキーが同じであると仮定)。

x = dict(a=1, b=2)
y = dict(a=2, b=2)

for key, val in x.items():
    if val == y[key]:
        print ('Ok', val, y[key])
    else:
        print ('Not', val, y[key])

出力:

Not 1 2
Ok 2 2

-7
import json

if json.dumps(dict1) == json.dumps(dict2):
    print("Equal")

1
これは、正確に要求された動作を行わない可能性があり、json std libを取り込みますが、動作します(json.dumpsデフォルト設定では確定的です)。
Daniel Farrell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.