如何在python中订购字典列表

时间:2018-10-24 09:25:03

标签: 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'},
]

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用适当的键功能进行排序。这一个先按给定名称排序(按给定顺序)。之后,所有其他品牌之间均未指定任何顺序:

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

答案 1 :(得分:0)

您可以使用字典来定义自定义排序顺序。

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中没有的内容排在最后。