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 案例二

暫時沒有想到好的解決方案!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章