Python 通过固定一个键';s值作为第一个元素
我有一张订购的清单Python 通过固定一个键';s值作为第一个元素,python,python-3.x,list,sorting,Python,Python 3.x,List,Sorting,我有一张订购的清单 [OrderedDict([('song', 'Hoses'), ('lyric', 'crea'), ('Music', 'reut'), ('BGM', 'DJU'), ('Totalsecs', 223.457894215)]) ,OrderedDict([('song', 'Goses'), ('lyric', 'recrea'), ('Music', 'reutser'), ('BGM', 'DJS'), ('Totalsecs', 158.5145538689
[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)
作为第一个元素,以便将其余的元素排序到下面,从而使有序dict列表成为
[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([('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)]
)]
给定OrderedDict
对象的列表a
:
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)])]
从操作员导入itemgetter
#检索阈值
阈值=A[1]['Totalsecs']
#排序高于阈值
sort1=sorted((如果i['Totalsecs']>=threshold,则i代表A中的i),key=itemgetter('Totalsecs'))
#排序低于阈值
sort2=排序((如果i['Totalsecs']<阈值,则i代表i),key=itemgetter('Totalsecs'))
#合并成一个列表
res=sort1+sort2
打印(res)
[OrderedDict([('song','Goses'),('lyric','recrea'),('Music','reutser'),
('BGM','DJS'),('Totalsecs',158.514553868968)],
订单信息([('song','Horses'),('lyric','crea'),('Music','reut'),
('BGM','DJU'),('Totalsecs',223.457894215)],
按顺序排列([('song','reoses'),('lyric','arecrea'),('Music','hiureut'),
('BGM','VJU'),('Totalsecs',11.879461215421)],
按顺序排列([('song','reteoses'),('lyric','makuri'),('Music','reut'),
('BGM','DJU'),('Totalsecs',123.513353868968)]]
在结果中,元素与第一个元素的间隔是如何排序的?223.45->11.87->123.51似乎没有排序。按递增顺序,158旁边的数字是223,如果发现有一个数字小于第一个元素,则它不应位于第一个元素之前,因此11位于223旁边,123位于11旁边,高于阈值的数字需要在低于阈值的数字下排序。似乎与您上次的@RoadRunner非常相似是的,这就是我在问题中提到的