在Python中按列表中的项对字典进行排序

fcg9iug3  于 2022-12-17  发布在  Python
关注(0)|答案(2)|浏览(188)

有可能对这类词典进行排序吗:
1.排名第一
1.如果rank相同,则按other_rank列表中的第一个元素排序
1.如果other_rank中的第一个元素相同-继续深入,直到列表中的最后一个元素。
如果这是一个麻烦,我可以使这本词典的结构化在不同的方式。

{'rank': 6, 'other_ranks': [7, 5]}
{'rank': 1, 'other_ranks': [7, 11, 6, 2]}
{'rank': 0, 'other_ranks': [12]}
{'rank': 1, 'other_ranks': [13, 11, 4, 3]}
{'rank': 1, 'other_ranks': [14, 12, 6, 5]}
{'rank': 4, 'other_ranks': [5, 4, 3, 2]}
{'rank': 0, 'other_ranks': [12]}
rm5edbpk

rm5edbpk1#

假设有一个列表,可以将operator.itemgettersorted的key参数结合使用:

from operator import itemgetter

lst = [{'rank': 6, 'other_ranks': [7, 5]},
       {'rank': 1, 'other_ranks': [7, 11, 6, 2]},
       {'rank': 0, 'other_ranks': [12]},
       {'rank': 1, 'other_ranks': [13, 11, 4, 3]},
       {'rank': 1, 'other_ranks': [14, 12, 6, 5]},
       {'rank': 4, 'other_ranks': [5, 4, 3, 2]},
       {'rank': 0, 'other_ranks': [12]}]

res = sorted(lst, key=itemgetter("rank", "other_ranks"))
print(res)

产出

[{'other_ranks': [12], 'rank': 0},
 {'other_ranks': [12], 'rank': 0},
 {'other_ranks': [7, 11, 6, 2], 'rank': 1},
 {'other_ranks': [13, 11, 4, 3], 'rank': 1},
 {'other_ranks': [14, 12, 6, 5], 'rank': 1},
 {'other_ranks': [5, 4, 3, 2], 'rank': 4},
 {'other_ranks': [7, 5], 'rank': 6}]

这里的关键是列表和元组是按字典顺序比较的,参见文档:
相同类型的序列也支持比较。特别是,元组和列表是通过比较对应的元素按字典顺序进行比较的。
因此,请按原样比较它们。

2sbarzqh

2sbarzqh2#

这叫做词法比较,Python的元组实现了这一点。

dictionaries = [
    {'rank': 6, 'other_ranks': [7, 5]},
    {'rank': 1, 'other_ranks': [7, 11, 6, 2]},
    {'rank': 0, 'other_ranks': [12]},
    {'rank': 1, 'other_ranks': [13, 11, 4, 3]},
    {'rank': 1, 'other_ranks': [14, 12, 6, 5]},
    {'rank': 4, 'other_ranks': [5, 4, 3, 2]},
    {'rank': 0, 'other_ranks': [12]},
]
dictionaries.sort(key=lambda dict_: (dict_['rank'], ) + tuple(dict_['other_ranks']))

相关问题