题目是这样的:
给定一个字典dict1,将其转换成dict2: dict1 = { 'fetal':[{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 23}, {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 4}], 'warning':[{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 30}, {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 50}] } dict2 = {'sjzx_sy22_121.201.56.5': [{'fetal': 23}, {'warning': 30}], 'sjzx_sy21_121.201.56.4': [{'fetal': 4}, {'warning': 50}]}
脑子摩擦了一个下午:
dict1 = { 'fetal': [{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 23}, {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 4}], 'warning': [{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 30}, {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 50}] } def getvalue(dictcome, key): retdict = {} for item in dictcome.get(key): # 遍历传入字典的key为传入key值的对应value,item为{'key': 'sjzx_sy22_121.201.56.5', 'doc_count': 23} valuelist = list(item.values()) # 将item的value值保存为列表 # ['sjzx_sy22_121.201.56.5', 23]//['sjzx_sy21_121.201.56.4', 4] retdict[valuelist[0]] = {key: valuelist[1]} # 保存为dict2字典的格式,主要是提取dict2的key return retdict # {'sjzx_sy22_121.201.56.5': {'fetal': 23}, 'sjzx_sy21_121.201.56.4': {'fetal': 4}} def combindtwo(dicta, dictb): # 合并两个字典,key值唯一,相同key对应的value保存为列表格式 for i,j in dictb.items(): if i in dicta.keys(): listtmp = [dicta.get(i), j] dicta.update({f'{i}': listtmp}) else: dicta.update({f'{i}': dictb[i]}) return dicta tmplist = [] for key in dict1.keys(): tmplist.append(getvalue(dict1, key)) # 这里按dict1的key值调用getvalue参数,将dict1换一种格式输入 # 将获取到的字典保存在列表里,但是下面调用combindtwo函数时,我是直接用item取的。。。我觉得怪怪的。但不知道该如何做?? print('原字典为:') print(dict1) print('修改后的字典如下:') print(combindtwo(tmplist[0], tmplist[1]))
最后输入结果为:(也算是达到目的了吧= =)
原字典为: {'fetal': [{'key': 'sjzx_sy22_121.201.56.5', 'doc_count': 23}, {'key': 'sjzx_sy21_121.201.56.4', 'doc_count': 4}], 'warning': [{'key': 'sjzx_sy22_121.201.56.5', 'doc_count': 30}, {'key': 'sjzx_sy21_121.201.56.4', 'doc_count': 50}]} 修改后的字典如下: {'sjzx_sy22_121.201.56.5': [{'fetal': 23}, {'warning': 30}], 'sjzx_sy21_121.201.56.4': [{'fetal': 4}, {'warning': 50}]}
然后看一下给我出题的大佬写的程序:
def get_ip_count(d): result = {} for key, values in d.items(): for ip_result in values: # 以 IP 为键,设置值为默认空列表 result.setdefault(ip_result['key'], []) # result[ip_result['key']] = [] result_count = {} result_count[key] = ip_result['doc_count'] result[ip_result['key']].append(result_count) return result if __name__ == '__main__': d = {'fetal': [{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 23}, {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 4}], 'warning': [{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 30}, {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 50}] } result = get_ip_count(d) print(result)
大佬说:难点在于先构造空字典,构造出空字典之后,在下一个循环又不会被冲掉。
setdefault()方法:
dict.setdefault(key[,default=None])
- key -- 字典中要查找的键。
- default -- 可选参数,如果指定键的值不存在时,返回该值,默认为 None。
- 返回指定键的值,如果指定键的值不在字典中返回指定值,默认为 None。
呵呵。
我要继续努力!