繁体   English   中英

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

[英]Get sorted list of indices, for a list of dictionaries sorted by a given key

我有一个带有多个键的字典列表,我想获得多个列表,每个列表都带有按特定键排序的字典索引。

例如,我有以下列表

a = [{"name": "Zoe", "age": 13}, {"name": "Adam", "age": 31}]

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

from operator import itemgetter
sorted(a, key=itemgetter("name"))

得到以下

[{'name': 'Adam', 'age': 31}, {'name': 'Zoe', 'age': 13}]

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

[1, 0] # order of the elements in `a` as sorted by name
[0, 1] # order of the elements in `a` as sorted by age

我的真实字典有更多的键值对,对我来说,返回a和具有按不同键排序的索引的其他列表(而不是对a多个排序列表)的效率更高。

您可以通过产生range()来产生索引的排序列表,然后调整排序键以将索引从a列表的字典转换为特定值:

sorted(range(len(a)), key=lambda i: a[i]['name'])
sorted(range(len(a)), key=lambda i: a[i]['age'])

如果您知道前面的键,只需循环并生成多个列表即可; 您也许可以创建一个由每个排序键作为键的字典:

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

上面的字典理解使您可以仅基于排序键访问每个排序列表:

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

一种简单的方法是在列表中的字典中添加索引字段。

from operator import itemgetter

a = [{'name':"Zoe", 'age':13}, {'name':"Adam", 'age':31}]

for i, d in enumerate(a): 
    d['index'] = i

def get_indices(seq):
    return[d['index'] for d in seq]

by_name = sorted(a, key=itemgetter("name"))
print by_name
print get_indices(by_name)

by_age = sorted(a, key=itemgetter("age"))
print by_age
print get_indices(by_age)

输出

[{'index': 1, 'age': 31, 'name': 'Adam'}, {'index': 0, 'age': 13, 'name': 'Zoe'}]
[1, 0]
[{'index': 0, 'age': 13, 'name': 'Zoe'}, {'index': 1, 'age': 31, 'name': 'Adam'}]
[0, 1]

当然,您不需要保留字典的排序列表,您可以这样做

by_name = get_indices(sorted(a, key=itemgetter("name")))

暂无
暂无

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

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