python - Python 3.7 中带有列表初始化的嵌套字典
问题描述
我有一本包含交换点数据的字典
points = {
1:{'name': 'ТОО ARS', 'address': 'str. 10А', 'rates': [{'currency': 'No Data', 'bid': 'No Data', 'ask': 'No Data'}], 'lat': 43.215702, 'lng': 76.860278, 'distance': 459, 'point_id': 10},
2:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'EUR', 'bid': 519.3, 'ask': 521.2}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
3:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'USD', 'bid': 430.0, 'ask': 432.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
4:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'TRY', 'bid': 86.0, 'ask': 88.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
5:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'KGS', 'bid': 6.0, 'ask': 8.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
6:{'name': 'ТОО ARS', 'address': 'str. 10А', 'rates': [{'currency': 'KGS-2', 'bid': 6.0, 'ask': 8.0}], 'lat': 43.215702, 'lng': 76.860278, 'distance': 360, 'point_id': 10},
}
我怎样才能得到新的字典
new_dict = {10: {'name': 'ТОО ARS',
'address': 'str. 10А',
'rates': [{'currency': 'No Data', 'bid': 'No Data', 'ask': 'No Data'},{'currency': 'KGS-2', 'bid': 6.0, 'ask': 8.0}]},
8: {'name': 'ТОО REAL EXCHANGE',
'address': 'ave. 10',
'rates': [{'currency': 'EUR', 'bid': 519.3, 'ask': 521.2},
{'currency': 'USD', 'bid': 430.0, 'ask': 432.0},
{'currency': 'TRY', 'bid': 86.0, 'ask': 88.0},
{'currency': 'KGS', 'bid': 6.0, 'ask': 8.0}]}}
我试过像
points = {
1:{'name': 'ТОО ARS', 'address': 'str. 10А', 'rates': [{'currency': 'No Data', 'bid': 'No Data', 'ask': 'No Data'}], 'lat': 43.215702, 'lng': 76.860278, 'distance': 459, 'point_id': 10},
2:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'EUR', 'bid': 519.3, 'ask': 521.2}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
3:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'USD', 'bid': 430.0, 'ask': 432.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
4:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'TRY', 'bid': 86.0, 'ask': 88.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
5:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'KGS', 'bid': 6.0, 'ask': 8.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
6:{'name': 'ТОО ARS', 'address': 'str. 10А', 'rates': [{'currency': 'KGS-2', 'bid': 6.0, 'ask': 8.0}], 'lat': 43.215702, 'lng': 76.860278, 'distance': 360, 'point_id': 10},
}
new_dict={}
test_keys=[]
z=0
rates=[]
for i in points:
test_keys.append(points[i]['point_id'])
for key in range(len(test_keys)-1):
if test_keys[key+1] == test_keys[key]:
test_keys.remove(test_keys[key+1])
for keys in test_keys:
new_dict[keys] = ''
for i in new_dict:
for j in points:
if i == points[j]['point_id']:
name = points[j]['name']
address = points[j]['address']
new_dict[i] = {'name':points[j]['name'], 'address':address, 'rates': rates}
for i in range(1,len(points)):
if points[i]['point_id'] in new_dict:
kurs = points[i]['rates'][0]
exchange_point_id = points[i]['point_id']
for j in new_dict.keys():
if exchange_point_id == j:
z+=1
if z>1:
rates.append(kurs)
new_dict[j]['rates'] = rates
elif z<=1:
new_dict[j]['rates'] = kurs
它不起作用
我得到的结果是:
{10: {'name': 'ТОО ARS',
'address': 'str. 10А',
'rates': {'currency': 'No Data', 'bid': 'No Data', 'ask': 'No Data'}},
8: {'name': 'ТОО REAL EXCHANGE',
'address': 'ave. 10',
'rates': [{'currency': 'EUR', 'bid': 519.3, 'ask': 521.2},
{'currency': 'USD', 'bid': 430.0, 'ask': 432.0},
{'currency': 'TRY', 'bid': 86.0, 'ask': 88.0},
{'currency': 'KGS', 'bid': 6.0, 'ask': 8.0}]}}
解决方案
您只想对具有相同 point_id 的元素进行分组?
from pprint import pprint
points = {
1:{'name': 'ТОО ARS', 'address': 'str. 10А', 'rates': [{'currency': 'No Data', 'bid': 'No Data', 'ask': 'No Data'}], 'lat': 43.215702, 'lng': 76.860278, 'distance': 459, 'point_id': 10},
2:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'EUR', 'bid': 519.3, 'ask': 521.2}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
3:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'USD', 'bid': 430.0, 'ask': 432.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
4:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'TRY', 'bid': 86.0, 'ask': 88.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
5:{'name': 'ТОО REAL EXCHANGE', 'address': 'ave. 10', 'rates': [{'currency': 'KGS', 'bid': 6.0, 'ask': 8.0}], 'lat': 43.218291, 'lng': 76.866234, 'distance': 915, 'point_id': 8},
6:{'name': 'ТОО ARS', 'address': 'str. 10А', 'rates': [{'currency': 'KGS-2', 'bid': 6.0, 'ask': 8.0}], 'lat': 43.215702, 'lng': 76.860278, 'distance': 360, 'point_id': 10},
}
new_dict = {}
for point in points.values():
point_id = point["point_id"]
if point_id in new_dict:
new_dict[point_id]["rates"].extend(point["rates"])
else:
new_dict[point_id] = point.copy()
new_dict[point_id].pop("point_id")
pprint(new_dict)
输出:
{8: {'address': 'ave. 10',
'distance': 915,
'lat': 43.218291,
'lng': 76.866234,
'name': 'ТОО REAL EXCHANGE',
'rates': [{'ask': 521.2, 'bid': 519.3, 'currency': 'EUR'},
{'ask': 432.0, 'bid': 430.0, 'currency': 'USD'},
{'ask': 88.0, 'bid': 86.0, 'currency': 'TRY'},
{'ask': 8.0, 'bid': 6.0, 'currency': 'KGS'}]},
10: {'address': 'str. 10А',
'distance': 459,
'lat': 43.215702,
'lng': 76.860278,
'name': 'ТОО ARS',
'rates': [{'ask': 'No Data', 'bid': 'No Data', 'currency': 'No Data'},
{'ask': 8.0, 'bid': 6.0, 'currency': 'KGS-2'}]}}
推荐阅读
- java - dockerized时Spring Boot Redis错误,但不是maven run
- node.js - NestJS - 如何在自定义验证中从猫鼬模式调用服务方法
- java - 如何像阅读器一样在网页视图中显示 HTML 文件?
- java - 在 Intent.ACTION_OPEN_DOCUMENT_TREE 返回的目录中创建新文件
- python - 使用 for 循环将子图添加到图形
- python - 在 Python 中验证输入的更简单方法是 >0?
- django - 自定义上下文处理器不适用于显示购物车项目
- sql - 避免进行大量修改的长时间运行的事务
- c - shm_open 分段错误和权限失败
- c++ - qt linux 部署 - 网络 OpenSSL 问题?