如何在python中排序词典列表

2024-09-22 16:35:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我的字典清单如下:

[
  {'id': 16419, 'name': 'Audi'},
  {'id': 13, 'name': 'BMW'},
  {'id': 31, 'name': 'Honda'},
  {'id': 50060, 'name': 'KTM'},
  {'id': 54, 'name': 'Opel'},
  {'id': 55, 'name': 'Peugeot'},
  {'id': 50083, 'name': 'PGO'},
  {'id': 16350, 'name': 'Skoda'},
  {'id': 68, 'name': 'Suzuki'},
  {'id': 2120, 'name': 'Triumph'},
  {'id': 16328, 'name': 'Others'},
  {'id': 16396, 'name': 'Seat'},
  {'id': 14979, 'name': 'Opel'},
  {'id': 6, 'name': 'Volkswagen'}
]

我要做的是订购。我想在列表的开头显示一些带有名称值的字典。你知道吗

我想要例如VolkswagenAudiBMWOpelPeugeot作为列表中出现的第一个参数。你知道吗

因此,想要的结果应该是这样的:

[
  {'id': 6, 'name': 'Volkswagen'}
  {'id': 16419, 'name': 'Audi'},
  {'id': 13, 'name': 'BMW'},
  {'id': 54, 'name': 'Opel'},
  {'id': 55, 'name': 'Peugeot'},
  {'id': 31, 'name': 'Honda'},
  {'id': 50060, 'name': 'KTM'},
  {'id': 50083, 'name': 'PGO'},
  {'id': 16350, 'name': 'Skoda'},
  {'id': 68, 'name': 'Suzuki'},
  {'id': 2120, 'name': 'Triumph'},
  {'id': 16328, 'name': 'Others'},
  {'id': 16396, 'name': 'Seat'},
  {'id': 14979, 'name': 'Opel'},
]

你知道怎么做吗?你知道吗


Tags: nameid字典audiothersvolkswagensuzukibmw
2条回答

可以使用字典定义自定义排序顺序。你知道吗

dicts = [
  {'id': 16419, 'name': 'Audi'},
  {'id': 13, 'name': 'BMW'},
  {'id': 31, 'name': 'Honda'},
  {'id': 50060, 'name': 'KTM'},
  {'id': 54, 'name': 'Opel'},
  {'id': 55, 'name': 'Peugeot'},
  {'id': 50083, 'name': 'PGO'},
  {'id': 16350, 'name': 'Skoda'},
  {'id': 68, 'name': 'Suzuki'},
  {'id': 2120, 'name': 'Triumph'},
  {'id': 16328, 'name': 'Others'},
  {'id': 16396, 'name': 'Seat'},
  {'id': 14979, 'name': 'Opel'},
  {'id': 6, 'name': 'Volkswagen'}
]

brand_order = ['Volkswagen', 'Audi', 'BMW', 'Opel', 'Peugeot']
order = dict(zip(brand_order, range(len(brand_order))))

dicts_sorted = sorted(dicts, key=lambda d: order.get(d['name'], float('inf')))
print(dicts_sorted)

输出:

[{'id': 6, 'name': 'Volkswagen'}, 
 {'id': 16419, 'name': 'Audi'}, 
 {'id': 13, 'name': 'BMW'},
 {'id': 54, 'name': 'Opel'},
 {'id': 14979, 'name': 'Opel'},
 {'id': 55, 'name': 'Peugeot'},
 {'id': 31, 'name': 'Honda'},
 {'id': 50060, 'name': 'KTM'},
 {'id': 50083, 'name': 'PGO'},
 {'id': 16350, 'name': 'Skoda'},
 {'id': 68, 'name': 'Suzuki'},
 {'id': 2120, 'name': 'Triumph'},
 {'id': 16328, 'name': 'Others'},
 {'id': 16396, 'name': 'Seat'}]

回溯到float('inf')可以确保order中没有的东西排在最后。你知道吗

您可以使用适当的键函数进行排序。这个先按名字排序。所有其他品牌紧随其后,彼此之间没有指定订单:

>>> rank = {x: i for i, x in enumerate(['Volkswagen', 'Audi', 'BMW', 'Opel', 'Peugeot'])}
# {'Volkswagen': 0, 'Audi': 1, ...}
>>> sorted(lst, key=lambda x: rank.get(x['name'], len(rank)))
[{'id': 6, 'name': 'Volkswagen'},
 {'id': 16419, 'name': 'Audi'},
 {'id': 13, 'name': 'BMW'},
 {'id': 54, 'name': 'Opel'},
 {'id': 14979, 'name': 'Opel'},
 {'id': 55, 'name': 'Peugeot'},
 {'id': 31, 'name': 'Honda'},
 {'id': 50060, 'name': 'KTM'},
 {'id': 50083, 'name': 'PGO'},
 {'id': 16350, 'name': 'Skoda'},
 {'id': 68, 'name': 'Suzuki'},
 {'id': 2120, 'name': 'Triumph'},
 {'id': 16328, 'name': 'Others'},
 {'id': 16396, 'name': 'Seat'}]

相关问题 更多 >