2016-10-24 18 views
2

辞書bとaを比較して、bのキーがaであるかどうかをチェックする必要があります。2つのdictsを比較し、非等価の値を出力する

存在する場合はa[key]==b[key]の値を確認します。一致しない場合は、参考のために両方の辞書のkey:valueのペアを印刷します。どうやってやるの?

a = {'key_1': 1,'key_2': 2, 'key_3': 3} 
b = {'key_1': 1,'key_2': 5} 

[k for key in b if key in a if b[k]!=a[k]] 

私は上記のコードを使用するが、私はあなたが投稿コード内の小さな誤りがあると思い

not equal: b[key_2]=5 and a[key_2]=2 

答えて

0

などの辞書のキーと値の両方を印刷することはできません。まず、同じオブジェクトにkkeyを混在させているようです。第2に、リスト内の2つの文を含めることはできませんが、代わりにandと組み合わせることができます。どのように見えるかは次のとおりです。[k for k in b if k in a and a[k]!=b[k]] これは、値が一致しないすべてのキーを含むリストを生成します。このような鍵があれば、たとえば"a[{k}]={a} and b[{k}]={b}".format(k=k,a=a[k],b=b[k])を使用して、その不一致を記述する人間が読める文字列を取得します。あなたが後で(印刷用に)それをループするためにそのキーのリストを作成するつもりならば、最初に実際にそのリストを作成する必要はありません。ディクショナリキーを直接反復するだけです。何をしたい

1

はおそらくこれです:つまり

result = [(k, a[k], b[k]) for k in a if k in b and a[k]!=b[k]] 

、「内鍵がBにもある時はいつでも、キーで構成されるタプルのリスト、最初の値と第2を生成し、対応する値は等しくありません "。

"and"のブール式はフェイルセーフです(左から右に評価し、False値が見つかるとすぐに停止します)ので、 "b [k]!= a [ k]」は例外を発生させる可能性があります。

これは、別の疑問を提起します。キーがaで、bでない場合、またはその逆の場合はどうでしょうか? ( 'car'、2、None)または( 'car'、None、2)?それも有効な答えでしょうか?

1

辞書bとaを比較して、bのキーがaであるかどうかを確認する必要があります。

a = {'key_1': 1,'key_2': 2, 'key_3': 3} 
b = {'key_1': 1,'key_2': 5} 

# find keys common to both 
inter = a.keys() & b 
diff_vals = [(k, a[k], b[k]) for k in inter if a[k] != b[k]] 
# find keys common to both 
inter = a.keys() & b 

for k,av, bv in diff_vals: 
    print("key = {}, val_a = {}, val_b = {}".format(k, av, bv)) 
key = key_2, val_a = 2, val_b = 5 

あなたはdict_viewのobjetcs上のさまざまなsetメソッドを使用することができます:あなたは交差キーを検索し、それらの値をチェックしたい。これはうまくいくかもしれない

# find key/value pairings that are unique to either dict 
symmetric = a.items()^b.items() 
{('key_2', 2), ('key_2', 5), ('key_3', 3)} 


# key/values in b that are not in a  
difference = b.items() - a.items() 
{('key_2', 5)} 

# key/values in a that are not in b 
difference = a.items() - b.items() 
{('key_3', 3), ('key_2', 2)} 

# get unique set of all keys from a and b 
union = a.keys() | b 
{'key_1', 'key_2', 'key_3'} 

# get keys common to both dicts 
inter = a.keys() & b 
{'key_1', 'key_2'} 
+0

これはpython3コードのようですか?なぜなら、python2では、ほとんどの部分を 'Set()'構造体 – helt

+0

@heltにラップする必要があったからです。python2に 'viewitems()'と 'viewkeys()'を使うだけです。これは 'items()'と 'keys()'を使ってpython3で得られるものを返します。 –

0

a = {'key_1': 1,'key_2': 2, 'key_3': 3} 
b = {'key_1': 1,'key_2': 5} 
i=[k for k in b if k in a if b[k]!=a[k]] 
if i: 
    for k in i: 
     print('not equal:b[',k,']=',b[k],'and a[',k,']=',a[k]) 

出力

not equal:b[ key_2 ]= 5 and a[ key_2 ]= 2 
関連する問題