有几种方法可以做到这一点。
第一个,可能也是最清楚的,是使用dicts 中的list 并按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,则不需要您创建中间数据结构。 p>
您还可以将reverse=True 传递给任何sorted 调用以按降序排序,而不是默认的升序。