Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取按给定键排序的字典列表的索引排序列表_Python_List_Sorting_Dictionary - Fatal编程技术网

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

Python 获取按给定键排序的字典列表的索引排序列表,python,list,sorting,dictionary,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

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

例如,我有以下列表

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}]
要获得以下信息:

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的多个排序列表。

您可以通过生成一个范围来生成一个排序的索引列表,然后调整排序键,将索引转换为列表中字典中的特定值:

如果你知道前面的关键点,只需循环并生成多个列表;您或许可以创建一个由每个排序键键入的字典:

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

通过生成一个范围,然后调整排序键,将索引转换为列表中字典中的特定值,可以生成已排序的索引列表:

如果你知道前面的关键点,只需循环并生成多个列表;您或许可以创建一个由每个排序键键入的字典:

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

一个简单的方法是在列表中的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)
输出

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

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

一个简单的方法是在列表中的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)
输出

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

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

那么,您期望的输出究竟是什么呢?列表列表,其中每个子列表都是已排序的列表?sorteda,key=itemgettername此部分应引发NameError。它们和你试过的代码完全一样吗?@marmeladze:我想我们可以假设有一个from操作符导入itemgetter行。@marmeladze没有。但是Martjin已经按照它的方式修复了它should@MartijnPieters谢谢我是在飞行中输入的…那么你到底希望输出什么呢?列表列表,其中每个子列表都是已排序的列表?sorteda,key=itemgettername此部分应引发NameError。它们和你试过的代码完全一样吗?@marmeladze:我想我们可以假设有一个from操作符导入itemgetter行。@marmeladze没有。但是Martjin已经按照它的方式修复了它should@MartijnPieters谢谢我在飞行中输入…例如,我只想有两个列表。。。一个[1,0]和另一个[0,1]…试图更清楚。。。我想要一个按名称排序的代码,然后打印一个按名称排序的代码,然后打印[1,0],这是一个很好的间接排序示例!我想它和使用键函数的任何排序一样有效,因为我假设它们都是隐藏的间接排序。@PM2Ring:是的,两者都是直接的O1查找。不过,我的版本不需要将索引复制到字典中:-我太习惯于这样做了,以至于有时我忘了使用更简单、更优雅的方法例如,我只想有两个列表。。。一个[1,0]和另一个[0,1]…试图更清楚。。。我想要一个按名称排序的代码,然后打印一个按名称排序的代码,然后打印[1,0],这是一个很好的间接排序示例!我想它和使用键函数的任何排序一样有效,因为我假设它们都是隐藏的间接排序。@PM2Ring:是的,两者都是直接的O1查找。不过,我的版本不需要将索引复制到字典中:-我太习惯于这样做了,以至于有时我忘了使用更简单、更优雅的方法