按名称排序字典列表并分配新密钥

时间:2017-10-23 09:27:17

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

我有一份地点和城镇的字典列表,以及它们的经度和纬度

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'))

2 个答案:

答案 0 :(得分: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时,使用索引作为键有点过分,你可以通过索引访问它。它仅在创建“稀疏”列表时有用。

答案 1 :(得分:1)

所以你想要这样的东西:

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