使用相同的键集在多个字典中查找不同的值

时间:2015-11-25 05:38:12

标签: 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'}]

我希望能够输出列表中的键(具有值)不同(如果有的话),如果没有输出空列表。

我尝试了这段代码,但它给了我那些具有相同值的代码。

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

输出:

{'a':'1'}

我也试过这个,但它只给了我第一本字典上的不同对。

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'}

2 个答案:

答案 0 :(得分:0)

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

  1. 循环解决方案:
  2. test = [{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}]
    keys = set()
    
    def loop_solution():
        for key,val in test[0].items():
            for item in test[1:]:
                if item[key] != val:
                    keys.add(key)
    
    1. 功能解决方案
    2. def is_duplicate_value(p_key,p_value):
          for item_dict in test:
              if item_dict[p_key] != p_value:
                  return True
          return False
      
      def func_solution():
          for key,val in test[0].items():
              if is_duplicate_value(key,val):
                  keys.add(key)
      
      

      如果您不想调用其他功能,请选择第一个解决方案。但我会推荐第二种解决方案,因为它更具可读性。

答案 1 :(得分:0)

请尝试此代码

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