-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 回答