通过识别具有相同键但具有不同值的集合来比较Python中的两个词典

时间:2014-12-04 19:45:57

标签: python list dictionary key key-value

我试图通过比较键来比较两个词典,如果两个单独的词典中的两个键是相同的,程序应检查值是否也相同,如果它们不相同,程序应该识别

这是我写的代码:

def compare(firstdict,seconddict):
    shared_items = set(firstdict()) & set(seconddict())
    length = len(shared_items)
    if length > 0:
        return shared_items
    if length < 1:
        return None
print(compare(firstdict,seconddict))

('firstdict'和'seconddict'是以前函数中的两个词典。)

当代码运行时,即使它们的值不同,它也会输出所有没有值的相同键。

例如:if:

firstdict = {'cat' : 'animal', 'blue' : 'colour', 'sun' : 'star'}

seconddict = {'cat' : 'pet', 'blue' : 'colour', 'earth' : 'star'}   

它会打印出来:

'cat', 'blue'

虽然我想把它打印出来:

'cat pet (animal)'

以确切的格式。

有关如何编辑我的代码以执行此操作的任何建议,请注意:)

4 个答案:

答案 0 :(得分:4)

您可以在词典keys()上使用set intersection。然后遍历这些并检查与这些键对应的值是否相同。如果没有,您可以使用format打印出来。

def compare(first, second):
    sharedKeys = set(first.keys()).intersection(second.keys())
    for key in sharedKeys:
        if first[key] != second[key]:
            print('Key: {}, Value 1: {}, Value 2: {}'.format(key, first[key], second[key]))

>>> compare(firstdict, seconddict)
Key: cat, Value 1: animal, Value 2: pet

另一个例子

>>> firstdict = {'cat' : 'animal', 'blue' : 'colour', 'sun' : 'star', 'name': 'bob', 'shape': 'circle'}
>>> seconddict = {'cat' : 'pet', 'blue' : 'colour', 'earth' : 'star', 'name': 'steve', 'shape': 'square'}

>>> compare(firstdict, seconddict)
Key: shape, Value 1: circle, Value 2: square
Key: cat, Value 1: animal, Value 2: pet
Key: name, Value 1: bob, Value 2: steve

答案 1 :(得分:0)

如果您的值也是可以使用的,那么您可以使用项来获得公共键/值配对:

firstdict = {'cat' : 'animal', 'blue' : 'colour', 'sun' : 'star'}

seconddict = {'cat' : 'pet', 'blue' : 'colour', 'earth' : 'star'}

common = set(firstdict.iteritems()).intersection(seconddict.iteritems())

for k,v in common:
    print("Key: {}, Value: {}".format(k,v))
Key: blue, Value: colour

要检查两个dicts是否相同,请检查每个dic:

print(len(common)) == len(firstdict)

查找具有不同值的公用密钥:

for k,v in firstdict.iteritems():
    if k in seconddict and seconddict[k] != v:
        print("Key: {}, Value: {}".format(k, seconddict[k]))
Key: cat, Value: pet

答案 2 :(得分:0)

在示例代码中使用集合使其效率低于简单地循环遍历键,这也可能更具可读性:

firstdict = {'cat' : 'animal', 'blue' : 'colour', 'sun' : 'star'}
seconddict = {'cat' : 'pet', 'blue' : 'colour', 'earth' : 'star'}

def compare(firstdict, seconddict):
    for key in firstdict:
        if key in seconddict:
            first, second = firstdict[key], seconddict[key]
            if first != second:
                print('%s %s (%s)' % (key, first, second))

compare(firstdict, seconddict)

输出:

cat animal (pet)

答案 3 :(得分:0)

Padraic的方法似乎比这个好,但它是另一种选择。所以这不是最好的方法,但它可以完成工作。

逐步浏览每个元素并手动比较它们。

def compare(dictOne,dictTwo):
    for keyOne in dictOne:
        for keyTwo in dictTwo:
            if keyTwo == keyOne:
                if dictOne[keyOne] != dictTwo[keyTwo]:
                    print(keyOne+" "+dictOne[keyOne]+" ("+dictTwo[keyTwo]+")")

compare(firstdict,seconddict)

你的问题说打算输出,并没有提到你希望它们在数组中返回,所以上面的代码将逐步通过两个dicts逐个比较它们并以不匹配的格式打印出来。