我有一份地点和城镇的字典列表,以及它们的经度和纬度
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'))
答案 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]))}
交替使用map
和operator.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]))}