通过将其中一个键值固定为第一个元素,自定义排序有序dict列表

时间:2018-06-02 12:30:06

标签: python python-3.x list sorting

我有一个ordereddict列表

[OrderedDict([('song', 'Hoses'), ('lyric', 'crea'), ('Music', 'reut'), ('BGM', 'DJU'),  ('Totalsecs', 223.457894215)])
,OrderedDict([('song', 'Goses'), ('lyric', 'recrea'), ('Music', 'reutser'), ('BGM', 'DJS'),  ('Totalsecs', 158.514553868968)])
,OrderedDict([('song', 'reoses'), ('lyric', 'arecrea'), ('Music', 'hiureut'), ('BGM', 'VJU'),  ('Totalsecs', 11.879461215421)])
,OrderedDict([('song', 'reteoses'), ('lyric', 'makuri'), ('Music', 'reut'), ('BGM', 'DJU'),  ('Totalsecs', 123.513353868968)]
)]

我想通过修复第一个元素基于totalsecs键对它们进行排序,即在上面的ordereddict列表中,我想修复('Totalsecs', 158.514553868968)作为第一个元素,以便其余部分排序在下面,所以有序字典列表将成为

[OrderedDict([('song', 'Goses'), ('lyric', 'recrea'), ('Music', 'reutser'), ('BGM', 'DJS'),  ('Totalsecs', 158.514553868968)])
 ,OrderedDict([('song', 'Hoses'), ('lyric', 'crea'), ('Music', 'reut'), ('BGM', 'DJU'),  ('Totalsecs', 223.457894215)])
,OrderedDict([('song', 'reoses'), ('lyric', 'arecrea'), ('Music', 'hiureut'), ('BGM', 'VJU'),  ('Totalsecs', 11.879461215421)])
,OrderedDict([('song', 'reteoses'), ('lyric', 'makuri'), ('Music', 'reut'), ('BGM', 'DJU'),  ('Totalsecs', 123.513353868968)]
)]

基本上我想修复第一个元素,其余的应该按排序顺序排列,如果有一个小于第一个元素的数字,它应该不在第一个元素之前。我们在python中有这个内置函数吗?我已经为列表提出了类似的问题,但是如果对于ordereddict列表

1 个答案:

答案 0 :(得分:1)

一种方法是分别执行两种排序然后合并。

给出AOrderedDict个对象的列表{/ 1}:

from operator import itemgetter

# retrieve threshold
threshold = A[1]['Totalsecs']

# sort above threshold
sort1 = sorted((i for i in A if i['Totalsecs'] >= threshold), key=itemgetter('Totalsecs'))

# sort below threshold
sort2 = sorted((i for i in A if i['Totalsecs'] < threshold), key=itemgetter('Totalsecs'))

# combine into one list
res = sort1 + sort2

print(res)

[OrderedDict([('song', 'Goses'), ('lyric', 'recrea'), ('Music', 'reutser'),
              ('BGM', 'DJS'), ('Totalsecs', 158.514553868968)]),
 OrderedDict([('song', 'Hoses'), ('lyric', 'crea'), ('Music', 'reut'),
              ('BGM', 'DJU'), ('Totalsecs', 223.457894215)]),
 OrderedDict([('song', 'reoses'), ('lyric', 'arecrea'), ('Music', 'hiureut'),
              ('BGM', 'VJU'), ('Totalsecs', 11.879461215421)]),
 OrderedDict([('song', 'reteoses'), ('lyric', 'makuri'), ('Music', 'reut'),
              ('BGM', 'DJU'), ('Totalsecs', 123.513353868968)])]