Пользовательская сортировка списка упорядоченных слов, фиксируя одно из значений ключа в качестве первого элемента. - PullRequest
0 голосов
/ 02 июня 2018

У меня есть список orderdict

[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, зафиксировав первый элемент, то есть в приведенном выше списке orderdicdic, я хочу исправить ('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?Я задал подобный вопрос для списков, но это если для списка orderdict

1 Ответ

0 голосов
/ 02 июня 2018

Один из способов - выполнить два вида по отдельности, а затем объединить.

При наличии списка A из OrderedDict объектов:

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)])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...