【问题标题】:Sorting of a list of dictionaries by name and assigning new key按名称排序字典列表并分配新键
【发布时间】:2018-04-03 19:12:58
【问题描述】:

我有一个位置和城镇的字典列表,它们的经度和纬度看起来像这样

STATIONS = [
{'lat': '78.27', 'name': 'Longyearbyen', 'location': 'Longyearbyen', 'lon': 
'15.49'},
{'lat': '71.03', 'name': 'Mehamn', 'location': 'Mehamn', 'lon': '27.83'},
{'lat': '70.67', 'name': 'Hammerfest', 'location': 'Hammerfest', 'lon': 
'23.67'},
{'lat': '70.37', 'name': 'Vardø', 'location': 'Vardø', 'lon': '30.91'},
{'lat': '69.79', 'name': 'Sørkjosen', 'location': 'Sørkjosen', 'lon': 
'20.95'},
{'lat': '69.65', 'name': 'Tromsø', 'location': 'Tromsø', 'lon': '18.94'},
{'lat': '69.61', 'name': 'Karasjok', 'location': 'Karasjok', 'lon': 
'25.30'} ]

`

我想把城镇按字母顺序排序,然后从0 开始为每个城镇分配一个新键。所以第一个城镇会有0: 'town name'1: 'second town name'等等。即

{0 : 'Town1', 1: 'town2' ....}

有没有合适的方法来做到这一点?当有许多词典列表时,我的头脑很混乱。

我已经设法通过使用按名称对列表进行排序

stations.sort(key=operator.itemgetter('name'))

【问题讨论】:

    标签: python-3.x list sorting dictionary list-comprehension


    【解决方案1】:

    是的。仅提取城镇名称,并使用enumerate 在字典理解中生成新的索引键:

    STATIONS = [
        {'lat': '78.27', 'name': 'Longyearbyen', 'location': 'Longyearbyen', 'lon':
        '15.49'},
        {'lat': '71.03', 'name': 'Mehamn', 'location': 'Mehamn', 'lon': '27.83'},
        {'lat': '70.67', 'name': 'Hammerfest', 'location': 'Hammerfest', 'lon':
        '23.67'},
        {'lat': '70.37', 'name': 'Vardø', 'location': 'Vardø', 'lon': '30.91'},
        {'lat': '69.79', 'name': 'Sørkjosen', 'location': 'Sørkjosen', 'lon':
        '20.95'},
        {'lat': '69.65', 'name': 'Tromsø', 'location': 'Tromsø', 'lon': '18.94'},
        {'lat': '69.61', 'name': 'Karasjok', 'location': 'Karasjok', 'lon':
        '25.30'} ]
    
    sorted_stations = {i:v for i,v in enumerate(sorted([x['name'] for x in STATIONS]))}
    

    交替使用 mapoperator.itemgetter 来避免理解:

    sorted_stations = {i:v for i,v in enumerate(sorted(map(operator.itemgetter('name'),STATIONS)))}
    

    结果:

    {0: 'Hammerfest', 1: 'Karasjok', 2: 'Longyearbyen', 3: 'Mehamn', 4: 'Sørkjosen', 5: 'Tromsø', 6: 'Vardø'}
    

    也就是说,当sorted(x['name'] for x in STATIONS) 生成一个您可以通过索引访问的list 时,使用索引作为键有点矫枉过正。它仅在创建“稀疏”列表时有用。

    【讨论】:

    • 谢谢,但我只想要新字典中的城镇名称,键范围为 0。所以我希望我的新字典完全符合以下格式:{0: 'town1', 1: 'town2', 2: 'town3' ....} 删除所有其他信息。
    【解决方案2】:

    所以你想要这样的东西:

    {i: item for i, item in enumerate(sorted([s['name'] for s in STATIONS]))}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2014-02-11
      • 2016-08-06
      • 2017-11-07
      • 1970-01-01
      • 2021-01-10
      相关资源
      最近更新 更多