获取索引的排序列表,以获取按给定键排序的词典列表

min*_*sky 1 python sorting dictionary list

我有一个包含多个键的字典列表,我希望得到多个列表,每个列表都有字典的索引,按特定键排序.

例如,我有以下列表

a = [{"name": "Zoe", "age": 13}, {"name": "Adam", "age": 31}]
Run Code Online (Sandbox Code Playgroud)

我知道我可以做到以下几点

from operator import itemgetter
sorted(a, key=itemgetter("name"))
Run Code Online (Sandbox Code Playgroud)

得到以下

[{'name': 'Adam', 'age': 31}, {'name': 'Zoe', 'age': 13}]
Run Code Online (Sandbox Code Playgroud)

但我真的希望能够获得两个带索引的列表:

[1, 0] # order of the elements in `a` as sorted by name
[0, 1] # order of the elements in `a` as sorted by age
Run Code Online (Sandbox Code Playgroud)

我的真正的字典有更多的键值对,它对我来说更有效率返回a和带有索引的附加列表按不同的键排序而不是多个排序列表a.

Mar*_*ers 5

您可以产生一个排序列表索引通过产生range(),然后调整排序关键的指标转化为从字典中一个特定的值a列表:

sorted(range(len(a)), key=lambda i: a[i]['name'])
sorted(range(len(a)), key=lambda i: a[i]['age'])
Run Code Online (Sandbox Code Playgroud)

如果您事先知道密钥,只需循环并生成多个列表; 你也许可以创建一个由每个排序键键入的字典:

{key: sorted(range(len(a)), key=lambda i: a[i][key]) for key in ('name', 'age')}
Run Code Online (Sandbox Code Playgroud)

上面的字典理解然后只允许您根据排序键访问每个排序列表:

>>> a = [{'name': "Zoe", 'age': 13}, {'name': "Adam", 'age': 31}]
>>> {key: sorted(range(len(a)), key=lambda i: a[i][key]) for key in ('name', 'age')}
{'age': [0, 1], 'name': [1, 0]}
Run Code Online (Sandbox Code Playgroud)