2017-08-24 11 views
0

辞書のリストが2つ並んでいないこと、すなわち、順序が異なっていても同じ内容であることを確認したいと思います。Pythonで未分類の辞書リストの照合

in重複した辞書が可能であるため、チェックが不十分です。

sorted(list_of_lists1) == sorted(list_of_lists2)

しかし、辞書をソートすることは、不安定である:それはリストのリストであれば(例えばlist1 = [dict1, dict1, dict2]list2 = [dict1, dict2, dict2]

、私はちょうどそれらを並べ替えると思います。

私はすべてのdictsをタプルに変換することでこれを回避できますが、これは非効率的で不足しているようです。

もっと直接的な解決策はありますか?

答えて

1

私はあなたが何かをハッシュする必要はないと思う - あなたは、キーと値のペアのタプルのソートされたリストに各辞書を変更し、それを並べ替えることができます。予想通り

def dict_list_eq(l1, l2): 
    sorted_l1 = sorted(sorted(d.items()) for d in l1) 
    sorted_l2 = sorted(sorted(d.items()) for d in l2) 
    return sorted_l1 == sorted_l2 

l1 = [{1: 2}, {3: 4}] 
l2 = [{3: 4}, {1: 2}] 
l3 = [{1: 209}, {3: 4}] 

print(dict_list_eq(l1, l2)) 
print(dict_list_eq(l1, l3)) 

出力、:

True 
False 
+0

これは私がやったことですが、実際に辞書でそれを行う方法があると思っていました。しかし、ありがとう! – mblakesley

+0

私が直感しているように、それらを辞書として保管しておけば、並べ替えることはできないので、それぞれの項目をそれぞれの項目と比較して 'O(n^2)'ランタイムになる必要があります。 (おそらく) 'O(n)'リスト/タプルへの変換、 'O(n log(n))'ソート、 'O(n)'の比較です。 –

0

あなたがまったく同じオブジェクトを使用すると、辞書のID(https://docs.python.org/3/library/functions.html#id)に依存することができます同じ回数は、各リストであり、そしてあなたが言及した並べ替えないことを確認するために探している場合:

if sorted(id(d) for d in list1) == sorted(id(d) for d in list2): 
    ... 

同じであるかもしれないが、同じpythonオブジェクトではないdictsを探しているなら、これはうまく動作しません。

+0

右、私の場合には、それらは同じオブジェクト等しいがありません。 – mblakesley