天天看點

python 去除字典清單中的重複字典

第一種:

li = [{'a': 1}, {'b': 2}, {'a': 1}]

li = [dict(t) for t in set([tuple(d.items()) for d in li])]
           

結果為:

第一步把 dict 清單轉成 tuple 清單,

[tuple(d.items()) for d in li])

[(('a', 1),), (('b', 2),), (('a', 1),)]
           

然後外面加個 set() 去重, 最後把去重後的 tuple set 轉成 dict list

第二種:

python 字典中 重複值去除

tuple_r_dict = lambda _dict: dict(val[::-1] for val in _dict.items()) # Python3.x

tuple_r_dict(tuple_r_dict(li))
           

1、lambda 匿名函數,冒号前為參數,個數可以有0個或多個,冒号右邊為傳回值

lambda [arg1 [, agr2,…argn]] : expression

這句表明建立一個匿名函數

  • 輸入:_dict
  • 輸出:dict(val[::-1] for val in _dict.items())

2、 _dict.items()

dict.items()傳回字典的(鍵,值)元組對的清單
           
dic={7:'d',9:'s',5:'a'}
print('dic:',dic)
print('dic.items():',dic.items())

#輸出
#dic: {9: 's', 5: 'a', 7: 'd'}
#dic.items(): dict_items([(9, 's'), (5, 'a'), (7, 'd')])
           

3、val[::-1]

把元組對順序對調

(1,'A')[::-1]  
=> ('A',1)
           

[1,2,3,4,5][:4:2] => [1,3] #取清單中的前4個數,步長為2//第一個冒号左右兩邊代表在這個清單中的截取範圍,第二個冒号右邊代表截取範圍内每2個取一個數

總結:

生成一個匿名函數,函數傳回一個字典dict(val[::-1] for val in _dict.items())

_dict.items()先傳回原字典的(鍵,值)元組對清單

val[::-1] for val in _dict.items() 周遊清單,把清單中的每個元組對中兩個值位置對調

dict()把清單轉變為字典

至此,生成的新字典的鍵為舊字典的鍵值,新鍵值為舊字典的鍵。利用字典的鍵唯一性,去除舊字典的重複鍵值。

再執行一次tuple_r_dict(tuple_r_dict(z)),把鍵值對再對調回來