Python:如何按值和索引对字典列表排序

Python:如何按值和索引对字典列表排序,python,sorting,Python,Sorting,我有一个数据字典列表,其中有些地方是有序的,有些地方是无序的: 例如: 我想把它们分类为: o = [{"text":'a', "value":1}, {"text":'b', "value":1}, {"text":'j', "value":2}, {"text":'x', "value":2}, {"text":'k', "value":3}, {"text":'m', "value":3}, {"text":'k',

我有一个数据字典列表,其中有些地方是有序的,有些地方是无序的:

例如:

我想把它们分类为:

 o = [{"text":'a', "value":1},
      {"text":'b', "value":1},
      {"text":'j', "value":2},
      {"text":'x', "value":2},
      {"text":'k', "value":3},
      {"text":'m', "value":3},
      {"text":'k', "value":50},
      {"text":'b', "value":50},
      {"text":'y', "value":52}]
其中,我的排序是项目索引和第二个值的某种组合,我考虑的排序是:

key=[(2nd value)<<len(closest power of 2 to len(index)) + index]
如何添加字典的索引

还有更好的排序键吗?

您试过这个吗:

sorted(data, key=lambda x: x['value']) 

看起来您正在寻找
文本
字段作为辅助排序键。最简单的方法是简单地按优先级顺序为键使用元组:

sorted(data, key=lambda x: (x['value'], x['text']) ) 
这能满足你的需要吗?输出:

[{'text': 'a', 'value': 1}, {'text': 'b', 'value': 1}, {'text': 'j', 'value': 2}, {'text': 'x', 'value': 2}, {'text': 'k', 'value': 3}, {'text': 'm', 'value': 3}, {'text': 'b', 'value': 50}, {'text': 'k', 'value': 50}, {'text': 'y', 'value': 52}]
值(k,50)和(b,50)现在是另一个顺序;我希望我能正确地理解你的想法


按操作说明更新

我检查了文件。Python的
sort
方法是稳定的,因此您根本不需要第二个sort键:在平局的情况下,
sort
将保持原始顺序:

>>> data.sort(key= lambda x:x['value'])
>>> data
[{'text': 'a', 'value': 1}, {'text': 'b', 'value': 1}, {'text': 'j', 'value': 2}, {'text': 'x', 'value': 2}, {'text': 'k', 'value': 3}, {'text': 'm', 'value': 3}, {'text': 'k', 'value': 50}, {'text': 'b', 'value': 50}, {'text': 'y', 'value': 52}]

。。。这就是您所要求的。

使用
枚举
获取索引并使用它进行排序

>>> res = [d for i,d in sorted(enumerate(data), key=lambda i_d: (i_d[1]['value'], i_d[0]))]
>>> pprint(res)
[{'text': 'a', 'value': 1},
 {'text': 'b', 'value': 1},
 {'text': 'j', 'value': 2},
 {'text': 'x', 'value': 2},
 {'text': 'k', 'value': 3},
 {'text': 'm', 'value': 3},
 {'text': 'k', 'value': 50},
 {'text': 'b', 'value': 50},
 {'text': 'y', 'value': 52}]
要对其进行适当排序,可以尝试使用
itertools.count

>>> from itertools import count
>>> cnt=count()
>>> data.sort(key=lambda d: (d['value'], next(cnt)))
>>> pprint(data)
[{'text': 'a', 'value': 1},
 {'text': 'b', 'value': 1},
 {'text': 'j', 'value': 2},
 {'text': 'x', 'value': 2},
 {'text': 'k', 'value': 3},
 {'text': 'm', 'value': 3},
 {'text': 'k', 'value': 50},
 {'text': 'b', 'value': 50},
 {'text': 'y', 'value': 52}]
>>> 

我不是在寻找文本字段作为辅助排序键,而是在寻找列表中项的列表索引作为辅助排序键。在这种情况下,您只需要任何稳定的排序。检查文件,以查看在出现平局时,哪些文件将保留原始顺序。我相信排序的已经做到了这一点。这就是我所说的我已经尝试过的。排序&对两个排序进行排序。我想按两个键进行排序。这很有效。有没有办法用sort代替sorted(我不想使用更多内存)。@azazel说。更新了答案
>>> res = [d for i,d in sorted(enumerate(data), key=lambda i_d: (i_d[1]['value'], i_d[0]))]
>>> pprint(res)
[{'text': 'a', 'value': 1},
 {'text': 'b', 'value': 1},
 {'text': 'j', 'value': 2},
 {'text': 'x', 'value': 2},
 {'text': 'k', 'value': 3},
 {'text': 'm', 'value': 3},
 {'text': 'k', 'value': 50},
 {'text': 'b', 'value': 50},
 {'text': 'y', 'value': 52}]
>>> from itertools import count
>>> cnt=count()
>>> data.sort(key=lambda d: (d['value'], next(cnt)))
>>> pprint(data)
[{'text': 'a', 'value': 1},
 {'text': 'b', 'value': 1},
 {'text': 'j', 'value': 2},
 {'text': 'x', 'value': 2},
 {'text': 'k', 'value': 3},
 {'text': 'm', 'value': 3},
 {'text': 'k', 'value': 50},
 {'text': 'b', 'value': 50},
 {'text': 'y', 'value': 52}]
>>>