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

时间:2015-10-11 13:15:24

标签: python list sorting dictionary

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

例如,我有以下列表

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和带有索引的附加列表按不同的键排序,而不是多个排序列表{{1 }}

2 个答案:

答案 0 :(得分:5)

您可以通过生成<activity android:theme="@android:style/Theme.Holo.Light.NoActionBar"> 生成 indices 的排序列表,然后调整排序键以将索引转换为来自{{1}的字典中的特定值} list:

range()

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

a

然后,上面的词典理解使您可以根据排序键单独访问每个排序列表:

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

答案 1 :(得分:2)

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

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")))