【问题标题】:Nested Dictionary in Python 3.7 with list initPython 3.7 中带有列表初始化的嵌套字典
【发布时间】:2021-05-23 17:47:59
【问题描述】:

我有一本包含交换点数据的字典

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}]}}

【问题讨论】:

    标签: python list dictionary nested


    【解决方案1】:

    您只想对具有相同 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'}]}}
    
    

    【讨论】:

    • 哦,谢谢您的评论。事实上,我想将 rate 元素与相同的 point_id 分组。是的
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2018-11-06
    • 2021-11-10
    • 2023-03-30
    相关资源
    最近更新 更多