这篇文章主要讲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}}
具体的实现代码如下:(为了提高通用性,以下代码创建了两个简单的字典obj3,obj4)
实现二维字典的键值合并,即将同个key下的value相加:
思路:先创建一个空字典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)这个函数可以实现对多个二维字典的键值相加,只要创建一个for循环就行了。
(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']}
下一步,统计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 实现二维字典的键值合并等函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 明达年度发烧碟MasterSuperiorAudiophile2021[DSF]
- 英文DJ 《致命的温柔》24K德国HD金碟DTS 2CD[WAV+分轨][1.7G]
- 张学友1997《不老的传说》宝丽金首版 [WAV+CUE][971M]
- 张韶涵2024 《不负韶华》开盘母带[低速原抓WAV+CUE][1.1G]
- lol全球总决赛lcs三号种子是谁 S14全球总决赛lcs三号种子队伍介绍
- lol全球总决赛lck三号种子是谁 S14全球总决赛lck三号种子队伍
- 群星.2005-三里屯音乐之男孩女孩的情人节【太合麦田】【WAV+CUE】
- 崔健.2005-给你一点颜色【东西音乐】【WAV+CUE】
- 南台湾小姑娘.1998-心爱,等一下【大旗】【WAV+CUE】
- 【新世纪】群星-美丽人生(CestLaVie)(6CD)[WAV+CUE]
- ProteanQuartet-Tempusomniavincit(2024)[24-WAV]
- SirEdwardElgarconductsElgar[FLAC+CUE]
- 田震《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- BEYOND《大地》24K金蝶限量编号[低速原抓WAV+CUE][986M]
- 陈奕迅《准备中 SACD》[日本限量版] [WAV+CUE][1.2G]