Python 2.7 使用同一组键在多个字典中查找不同的值

Python 2.7 使用同一组键在多个字典中查找不同的值,python-2.7,dictionary,Python 2.7,Dictionary,我有一个需要比较的多个词典的列表。列表中的词典数量将根据查询结果而变化 具有相同键但不同值的字典示例列表: test = [{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}] 所需输出: [{'b':'1','c':'4'},{'b':'2','c':'5'},{'b':'3','c':'6'}] {'a':'1'} {'b': '1', 'c': '4'} 我希望能够输出列表上不同

我有一个需要比较的多个词典的列表。列表中的词典数量将根据查询结果而变化

具有相同键但不同值的字典示例列表:

test = [{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}]
所需输出:

[{'b':'1','c':'4'},{'b':'2','c':'5'},{'b':'3','c':'6'}]
{'a':'1'}
{'b': '1', 'c': '4'}
我希望能够输出列表上不同的键(带值的键)(如果有),如果没有,则输出一个空列表

我尝试了这个代码,但是它给了我相同值的代码

mysets = (set(x.items()) for x in test)
print reduce(set.intersection, mysets)
输出:

[{'b':'1','c':'4'},{'b':'2','c':'5'},{'b':'3','c':'6'}]
{'a':'1'}
{'b': '1', 'c': '4'}
我也试过这本,但它只给了我第一本字典上不同的一对

def IntersectDicts( d1, d2 ) :
    return dict(filter(lambda (k,v) : k in d2 and d2[k] != v, d1.items()))

result = reduce(IntersectDicts, test)
print result
输出:

[{'b':'1','c':'4'},{'b':'2','c':'5'},{'b':'3','c':'6'}]
{'a':'1'}
{'b': '1', 'c': '4'}

我写了两个解决方案来解决你的问题

  • 循环解决方案:
  • 测试=[{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}] keys=set() def loop_解决方案(): 对于键,测试[0]中的val。项() 对于测试[1:]中的项目: 如果项目[键]!=瓦尔: 键。添加(键)
  • 功能溶液
  • def是重复值(p_键,p_值): 对于测试中的项目: 如果项目[p_键]!=p_值: 返回真值 返回错误 def func_解决方案(): 对于键,测试[0]中的val。项() 如果是重复值(键,值): 键。添加(键)
    如果不想调用其他函数,请选择第一个解决方案。但是我推荐第二个解决方案,因为它更具可读性。

    我写了两个解决方案来解决您的问题

  • 循环解决方案:
  • 测试=[{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}] keys=set() def loop_解决方案(): 对于键,测试[0]中的val。项() 对于测试[1:]中的项目: 如果项目[键]!=瓦尔: 键。添加(键)
  • 功能溶液
  • def是重复值(p_键,p_值): 对于测试中的项目: 如果项目[p_键]!=p_值: 返回真值 返回错误 def func_解决方案(): 对于键,测试[0]中的val。项() 如果是重复值(键,值): 键。添加(键) 如果不想调用其他函数,请选择第一个解决方案。但我推荐第二种解决方案,因为它更具可读性。

    请尝试此代码

    import copy
    
    test = [{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}]
    
    ftest = copy.deepcopy(test)
    keyy = ''
    for d in range(len(test)):
        ftest[d] = {}
        for k, y in test[d].items():
            for f in range(len(ftest)):
                if k in ftest[f] and y == ftest[f].get(k):
                    keyy = k
                    ftest[f].pop(k)
                    test[f] = ftest[f]
        if keyy:
            test[d].pop(keyy)
            keyy = ''
        ftest = copy.copy(test)
    print 'TESTINGGGGG  ---------------------', test
    
    请尝试此代码

    import copy
    
    test = [{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}]
    
    ftest = copy.deepcopy(test)
    keyy = ''
    for d in range(len(test)):
        ftest[d] = {}
        for k, y in test[d].items():
            for f in range(len(ftest)):
                if k in ftest[f] and y == ftest[f].get(k):
                    keyy = k
                    ftest[f].pop(k)
                    test[f] = ftest[f]
        if keyy:
            test[d].pop(keyy)
            keyy = ''
        ftest = copy.copy(test)
    print 'TESTINGGGGG  ---------------------', test
    

    你想要哪种类型的????像{'a':'1','c':'6','b':'3'}对不起,我编辑了这个问题@user00000341,这是你想要输出哪种类型的第一个输出????像{'a':'1','c':'6','b':'3'}对不起,我编辑了问题@user0000341,这是第一个OUPUTTANKS@RockOnGom,我使用了第一个解决方案,尽管它只返回密钥。谢谢@RockOnGom,我使用了第一个解决方案,尽管它只返回密钥。