Есть несколько способов сделать это.
Первое, и, вероятно, самое ясное, это использовать list
из dicts
и сортировать по ключу Score :
from operator import itemgetter
unsorted_data = [{'name': 'John Smith', 'score': 100},
{'name': 'Dum Dum', 'score': 55},
{'name': 'Billy Kid', 'score': 81},
{'name': 'Bob Joe', 'score': 95}]
sorted(unsorted_data, key=itemgetter('score'))
Выход:
[{'name': 'Dum Dum', 'score': 55}, {'name': 'Billy Kid', 'score': 81}, {'name': 'Bob Joe', 'score': 95}, {'name': 'John Smith', 'score': 100}]
Второй - использовать один dict
:
scores = {'John Smith': 100, 'Bob Joe': 95, 'Billy Kid': 81, 'Dum Dum': 55}
sorted(scores.items(), key=itemgetter(1))
Выход:
[('Dum Dum', 55), ('Billy Kid', 81), ('Bob Joe', 95), ('John Smith', 100)]
Это, IMO, менее интуитивно, так как он возвращает list
из tuples
, который вы должны индексировать по позиции, а не очевидный строковый ключ. Это экономит немного места, но это тот тип вещей, о котором вам почти никогда не придется беспокоиться об оптимизации, так как вы все равно используете Python.
Последняя сортировка основана на zip
:
namesOrder = [100, 95, 81, 55]
gradesOrder = ['John Smith', 'Bob Joe', 'Billy Kid', 'Dum Dum']
[name for grade, name in sorted(zip(namesOrder, gradesOrder))]
Выход:
['Dum Dum', 'Billy Kid', 'Bob Joe', 'John Smith']
Возвращает только имен, что может быть тем, что вы хотите в некоторых ситуациях, и не требует создания промежуточной структуры данных, если ваши данные кратны lists
.
Вы также можете передать reverse=True
любому из вызовов sorted
для сортировки в порядке убывания вместо значения по умолчанию в порядке возрастания.