python 實現二維字典的鍵值合并等函數
這篇文章主要講python中關于字典的一些具體操作,講解的問題都是本人在實際編程中所遇到的問題,讀者可以根據自己所遇到的問題具體問題具體分析。
(1) 二維字典的鍵值合并:
先提供一個應用場景:
假設我有兩個二維字典:
room1 = {orderid1:{roomid1:pred1,roomid2:pred2},orderid2:{roomid3:pred3,roomid4:pred4}}
room2 = {orderid1:{roomid1:pred5,roomid2:pred6},orderid2:{roomid3:pred7,roomid4:pred8}}
這兩個字典的key相同,只有第二維的value不同,我的目的是把這兩個字典的value相加,得到的結果如下:
sum_room = {orderid1:{roomid1:pred1+pred5,roomid2:pred2+pred6},orderid2:{roomid3:pred3+pred7,roomid4:pred4+pred8}}
具體的實現代碼如下:(為了提高通用性,以下代碼創(chuàng)建了兩個簡單的字典obj3,obj4)
實現二維字典的鍵值合并,即將同個key下的value相加:
思路:先創(chuàng)建一個空字典all_room,將all_room與obj的value相加并賦給all_room:
from collections import defaultdict
all_room = defaultdict(defaultdict)
obj3 = {'a':{'aa':1,'aa1':2},'b':{'bb':2},'c':3}
obj4 = {'a': {'aa': 5, 'aa1': 6}, 'b': {'bb': 7}, 'c': 8}
def sum_value(obj):
for key in obj:
if type(obj[key]).__name__ == 'dict':
if key not in all_room:
all_room[key] = {}
for subkey in obj[key]:
if subkey not in all_room[key]:
all_room[key][subkey] = 0
all_room[key][subkey] += obj[key][subkey]
else:
if key not in all_room:
all_room[key] = 0
all_room[key] += obj[key]
return all_room
看一下結果:
sum_value(obj3)
Out[40]:
defaultdict(collections.defaultdict,
{'a': {'aa': 1, 'aa1': 2}, 'b': {'bb': 2}, 'c': 3})
sum_value(obj4)
Out[41]:
defaultdict(collections.defaultdict,
{'a': {'aa': 6, 'aa1': 8}, 'b': {'bb': 9}, 'c': 11})
實現了文章開頭所述功能。
sum_value(obj)這個函數可以實現對多個二維字典的鍵值相加,只要創(chuàng)建一個for循環(huán)就行了。
(2)往字典的key里添加一個新的value:
同樣提供一個應用場景:
dict1 = {'order1': ['room1', 'room1'],'order2': ['room3', 'room3']}
dict2 = {'order1': 'room2', 'order2': 'room3'}
我的目的是想把dict2中key里的value添加進dict1中相同的key里,理想結果如下:
dict1 = {'order1': ['room1', 'room1', 'room2'], 'order2': ['room3', 'room3', 'room3']}
下面給出實現代碼:
for key in dict1.keys(): a=[] b=[] b = dict1[key] for i in b: ##這一步很關鍵,目的是把dict1[key]的value值逐個取出存進a,再把dict2[key]的value值存進a里面,這樣可以避免dict1[key]出現多個list層 a.append(i) a.append(dict2[key]) ##dict2[key]必須保證只有一個元素 dict1[key] = a
結果如下:
dict1
Out[88]: {'order1': ['room1', 'room1', 'room2'], 'order2': ['room3', 'room3', 'room3']}
下一步,統(tǒng)計key中的value個數:
from collections import Counter for key,item in dict1.items(): count[key] = Counter(item)
結果如下:
count
Out[91]: {'order1': Counter({'room1': 2, 'room2': 1}), 'order2': Counter({'room3': 3})}
接著,取出每個外層key中里層value最大的key(比較拗口,即取出每個orderid中roomid的值最大的roomid):
(舉個例子,在order1中,room1的值為2,是最大值,所以我把room1賦給order1,即result1 = {'order1':'room1'})
result = {}
for key,item in count.items():
result[key] = max(item,key=item.get)
結果如下:
result
Out[94]: {'order1': 'room1', 'order2': 'room3'}
(3)字典的排序:sorted()函數
import operator
dic = {(1, 2): 3, (1, 3): 4, (4, 5): 14} ##字典的key可以是元組;
ds = sorted(dic.items(),key=operator.itemgetter(1),reverse=True) ##如果要升序排列,把reverse=True去掉即可;
ds
Out[21]: [((4, 5), 14), ((1, 3), 4), ((1, 2), 3)]
(4)字典中不允許出現一個鍵對應多個值的情況,當出現這種情況時,取最后的鍵值對:
如:
>>> dict1 = {'foo':789, 'foo': 'xyz'}
>>> dict1 結果:{'foo': 'xyz'}
以上這篇python 實現二維字典的鍵值合并等函數就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Ubuntu中安裝指定Python版本方法詳解(理論上各版本通用)
現在基于linux的發(fā)行版本有很多,有centos,ubuntu等,一般基于linux的衍生系統(tǒng)至少都安裝了Python2版本,但是現在Python已經是3.x版本大行其道了,這篇文章主要給大家介紹了關于Ubuntu中安裝指定Python版本方法的相關資料,理論上各版本通用,需要的朋友可以參考下2023-06-06

