2015-11-25 12 views
1

我有一個需要比較的多個字典列表。列表中的字典數量將根據查詢結果而變化。字典的使用同一組密鑰在多字典中查找不同值

實施例列表中具有相同的密鑰,但不同的值:

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

你想出來把哪種類型????像{'a':'1','c':'6','b':'3'} – user00000341

+0

對不起,我編輯了問題@ user00000341,它的第一個輸出 – essramos

回答

0

我寫了兩個解決方案來解決你的問題。

  1. 循環解決方案:
 
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) 
  • 功能的解決方案
  •  
    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) 
    
    

    如果你不想調用另一個函數,那麼就選擇第一個解決方案。但我會推薦第二種解決方案,因爲它更具可讀性。

    +0

    謝謝@RockOnGom,我使用了第一種解決方案,儘管它只返回鍵。 – essramos

    +0

    @anon你能否確認我的答案,如果解決的話。 – RockOnGom

    +0

    是的,它工作謝謝@RockOnGom – essramos

    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 
    
    相關問題