题目是这样的:
给定一个字典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 dictatmplist = []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 resultif __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。
呵呵。
我要继续努力!