Python開發之一鍵多值的使用以及帶來的數據重複問題
前言:我們在實際的應用中,可能碰到一個鍵有多次使用的情況出現,一個鍵對應的值可以是一個字典也可以是一個列表,這個時候,我們就要根據具體情況具體分析,以及出現的問題,該怎麼去解決!
注意:如果你對Python的字典、列表以及元組還不是很瞭解的話,歡迎查看我得系列博客
《Python快速入門(五)高級函數1:列表、del關鍵字、元組》
《Python快速入門(六)高級函數2:字典、字符串、for語法》
《Python基礎:列表、字典、json之間的相互轉換》
《Python開發之list中的多重嵌套合併去重》
相信你看完之後,會有不小的收穫,接下來開始切入正題!
1.值重複,使用列表作爲值
1.1案例一
代碼:
#方案一: 值可以重複,使用[]作爲值
d1 = {}
key = 'name'
val = 'fly1'
d1.setdefault(key, []).append(val)
print(d1)
val = 'fly2'
d1.setdefault(key, []).append(val)
print(d1)
val = 'fly2'
d1.setdefault(key, []).append(val)
print(d1)
key = 'name2'
val = 'fly1'
d1.setdefault(key, []).append(val)
print(d1)
val = 'fly2'
d1.setdefault(key, []).append(val)
print(d1)
val = 'fly2'
d1.setdefault(key, []).append(val)
print(d1)
輸出:
出現的問題:我們可以看到name、name2裏面的列表中出現了重複的數據(fly2),在實際的使用中,我們肯定是不希望這種現象出現,所以我們要對這個列表值進行去重處理,接下來看《1.2 案例二》
1.2 案例二
d1 = {'name': ['fly1', 'fly2', 'fly2'], 'name2': ['fly1', 'fly2', 'fly2']}
new_d1 = {}
for d in d1:
new_list = list(set(d1[d])) #去重
for new in new_list: #再重新生成字典
new_d1.setdefault(d,[]).append(new)
print(new_d1)
輸出:
1.3 案例三(綜合案例:字典的合併)
如下圖所示:
現在有兩個字典,需要合併,我們合併的時候要考慮裏面鍵值對的重複情況,我得思路是兩個字典先合併成一個字典,然後在對這個字典進行遍歷,遍歷的時候,再對列表裏面的字典進行去重。(字典去重,需要藉助functools裏面的reduce方法)
代碼:
from functools import reduce
def get_dict1():
return {"A":[{"title":10,"age":20},{"title":12,"age":30}],
"B":[{"title":10,"age":20}]}
def get_dict2():
return {"A":[{"title":12,"age":30},{"title":14,"age":31}]}
def hebing(dict1, dict2):
fial_dic = {}
for d1 in dict1:
for dd in dict1[d1]:#遍歷字典中的列表
fial_dic.setdefault(d1, []).append(dd)#重新生成字典
for d2 in dict2:
for dd in dict2[d2]:#遍歷字典中的列表
fial_dic.setdefault(d2, []).append(dd)#重新生成字典
fial_dic2 = {}
for f in fial_dic:
new_data_list = reduce(lambda x, y: x if y in x else x + [y], [[], ] + fial_dic[f]) #列表裏面的字典去重
for new in new_data_list:
fial_dic2.setdefault(f, []).append(new)
return fial_dic2
if __name__ == '__main__':
dict1 = get_dict1()
dict2 = get_dict2()
print(hebing(dict1,dict2))
輸出:
2.值唯一,使用字典或者列表作爲值
2.1 案例一
代碼:
d = {}
key = "fly"
k2 = 'a'
v2 = [1,2]
d.setdefault(key, {})[k2] = v2 # 使用字典來獲取新值
print(d)
k2 = 'b'
v3 = [3,4]
d.setdefault(key, {})[k2] = v3 # 確保鍵值唯一
print(d)
k2 = 'b'
v4 = [4,5]
d.setdefault(key, {})[k2] = v4 # 確保鍵值唯一
print(d)
輸出:
出現的問題:我們看到b鍵的值一開始是[3,4],到後面之後變成了[4,5],在實際處理問題的時候,我們可能這兩條數據都要,所以需要保留兩條數據,而且還要考慮數據重複去重的問題,所以我們要進行把這兩條數據進行合併,請看《2.2 案例二》
2.2 案例二
暫時沒有想到好的解決方案!