简体   繁体   English

如何在python中订购字典列表

[英]How to order list of dictionaries in python

I have list of dictionaries as follows: 我有以下词典列表:

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

What I want to do is to order it. 我要做的是订购它。 And I want that some dictionaries with some name values show in the beginning of the list. 我希望一些带有某些名称值的字典显示在列表的开头。

I want that for example Volkswagen , Audi , BMW , Opel , Peugeot as first params appears in list. 我希望例如VolkswagenAudiBMWOpelPeugeot作为第一个参数出现在列表中。

Thus the wanted result should be something like this: 因此所需的结果应该是这样的:

[
  {'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'},
]

Any idea how to do that? 任何想法如何做到这一点?

You can use an appropriate key function for your sorting. 您可以使用适当的键功能进行排序。 This one orders by the given names first (in the given order). 这一个先按给定名称排序(按给定顺序)。 All other brands come after that with no order specified among themselves: 所有其他品牌之后都没有指定任何顺序:

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

You can use a dictionary to define a custom sorting order. 您可以使用字典来定义自定义排序顺序。

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)

Output: 输出:

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

Falling back to float('inf') ensures that whatever is not in order comes last. 回落到float('inf')可以确保所有未按order都排在最后。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM