-2

次の形式の 2 つの大きな python 辞書があり、それらを比較して、同じキーに対して同一のインデックスでの不一致を報告したいと考えています。辞書のキーは同じですが、タプルの長さは等しくありません。

d1 = {'a':(1,2,3,4,66,6,6,64), 'b':(3,2,5,3,2,1,1,1)}
d2 = {'a':(1,2,4,3,66,6,6,64), 'b':(1,8,5,3,2,1,22,9)}

たとえば、キー「a」の場合、インデックス 2 と 3 の異なる値。辞書が大きく、タプルの長さが必ずしも等しくないため、私のアマチュアのループ方法は機能しません。

for k1,v1 in dict1:
    for k2, v2 in dict2:
        if k1 == k2:
           for i in range(len(v1)):
              for j in range(len(v2)):
                  if i==j:
                     if v1[i] != v2[j]:
                        print k1, v1[i]
                        print k2, v2[i]
4

2 に答える 2

1

ここから始めましょう:

for k in d1:
    if k not in d2:
        continue
    v1, v2 = d1[k], d2[k]
    for i in xrange(min(len(v1), len(v2))):
        if v1[i] != v2[i]:
            print k, i, v1[i]
            print k, i, v2[i]

それは印刷します:

a 0 1
a 0 2
a 1 2
a 1 33
a 2 3
a 2 4
a 3 4
a 3 5
b 0 3
b 0 1
b 1 2
b 1 8
b 2 2
b 2 5
b 3 1
b 3 3

それがあなたが望むすべてかどうかを確認してください。辞書に同じキーがない場合はどうなりますか? 長さが異なるタプルはどうですか?など。すべてを把握して、上記を調整して、必要なことを行うことができます;-)

于 2013-09-26T01:36:29.953 に答える
1

ディクショナリ イテレータによって返される順序に関係なく、両方のディクショナリで見つかったすべてのキーを処理する場合は、次のようにします。

d1k = set(d1.keys())
for d in d1k.intersection(d2.keys()):
    # handle tuple comparison

順序や重複を考慮せずにタプル比較を処理したい場合は、次のようになります。

if len d1[d] < d2[d]:
    for v in d1[d]:
        if v not in d2[d]:
            print d, v
else:
    for v in d2[d]:
        if v not in d1[d]:
            print d, v
于 2013-09-26T01:58:56.600 に答える