Python - 如何根据值和键对字典进行排序
Python - How to sort a dictionary based on its value as well it key
我有一本字典:-
{
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16,
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24 }
...我希望它按照元组键的第二个字段以及字典的值字段进行排序...所以结果字典应该是:-
{
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24,
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16
}
...我尝试单独使用值对其进行排序,但它弄乱了键元组顺序...是的,所以我之后通过执行...将其分配给列表...
list = sorted(unsorted_dict, key = unsorted_dict.__getitem__, reverse=True)....
很抱歉,但回答部分解决了我的情况...
我不想考虑排序的第一个值..假设我有初始数据....
{
(5, 1): 16,
(6, 2): 16,
(7, 3): 16,
(8, 4): 16,
(4, 1): 24,
(3, 2): 24,
(2, 3): 24,
(1, 4): 24 }
我想要输出...
{
(4, 1): 24,
(3, 2): 24,
(2, 3): 24,
(1, 4): 24,
(5, 1): 16,
(6, 2): 16,
(7, 3): 16,
(8, 4): 16 }
...正如我所说,我想考虑元组 second 的排序值,而不考虑排序的第一个值...这也会有很大的帮助如果有人能告诉..我如何从这个排序的字典中提取元组到像..
这样的列表
(4, 1),(3, 2),(2, 3),(1, 4),(5, 1),(6, 2),(7, 3),(8, 4)
编辑: 所以评论有助于得到我想要的...非常感谢...
list_sorted = sorted(unsorted_dict.items(),key=lambda x: (-x[1],x[0][1]))
for val in list_sorted:
final_list.append(val[0])
更正了键值对感谢@Padraic Cunningham 指出
dicts
没有顺序,您可以对项目进行排序:
d={
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16,
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24 }
from pprint import pprint as pp
pp(sorted(d.items(),key=lambda x: (-x[1],x[0])))
[((2, 1), 24),
((2, 2), 24),
((2, 3), 24),
((2, 4), 24),
((1, 1), 16),
((1, 2), 16),
((1, 3), 16),
((1, 4), 16)]
如果你真的想要一个包含项目的字典,你可以从排序的项目中创建一个 collections.OrderedDict:
from collections import OrderedDict
od = OrderedDict(sorted(d.items(),key=lambda x: (-x[1],x[0])))
OrderedDict([((2, 1), 24), ((2, 2), 24), ((2, 3), 24), ((2, 4), 24), ((1, 1), 16), ((1, 2), 16), ((1, 3), 16), ((1, 4), 16)])
我们的主要排序键是每个值,通过用 -
取反每个值从高到低排序,然后我们用 key/tuple 从低到高排序打破平局。
按元组中的第二个元素断开连接:
pp(sorted(d.items(),key=lambda x:(-x[1],x[0][1])))
您编辑的输出现在有不同的键和不同的值,所以不确定 sort 如何做到这一点。
我有一本字典:-
{
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16,
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24 }
...我希望它按照元组键的第二个字段以及字典的值字段进行排序...所以结果字典应该是:-
{
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24,
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16
}
...我尝试单独使用值对其进行排序,但它弄乱了键元组顺序...是的,所以我之后通过执行...将其分配给列表...
list = sorted(unsorted_dict, key = unsorted_dict.__getitem__, reverse=True)....
很抱歉,但回答部分解决了我的情况...
我不想考虑排序的第一个值..假设我有初始数据....
{
(5, 1): 16,
(6, 2): 16,
(7, 3): 16,
(8, 4): 16,
(4, 1): 24,
(3, 2): 24,
(2, 3): 24,
(1, 4): 24 }
我想要输出...
{
(4, 1): 24,
(3, 2): 24,
(2, 3): 24,
(1, 4): 24,
(5, 1): 16,
(6, 2): 16,
(7, 3): 16,
(8, 4): 16 }
...正如我所说,我想考虑元组 second 的排序值,而不考虑排序的第一个值...这也会有很大的帮助如果有人能告诉..我如何从这个排序的字典中提取元组到像..
这样的列表(4, 1),(3, 2),(2, 3),(1, 4),(5, 1),(6, 2),(7, 3),(8, 4)
编辑: 所以评论有助于得到我想要的...非常感谢...
list_sorted = sorted(unsorted_dict.items(),key=lambda x: (-x[1],x[0][1]))
for val in list_sorted:
final_list.append(val[0])
更正了键值对感谢@Padraic Cunningham 指出
dicts
没有顺序,您可以对项目进行排序:
d={
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16,
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24 }
from pprint import pprint as pp
pp(sorted(d.items(),key=lambda x: (-x[1],x[0])))
[((2, 1), 24),
((2, 2), 24),
((2, 3), 24),
((2, 4), 24),
((1, 1), 16),
((1, 2), 16),
((1, 3), 16),
((1, 4), 16)]
如果你真的想要一个包含项目的字典,你可以从排序的项目中创建一个 collections.OrderedDict:
from collections import OrderedDict
od = OrderedDict(sorted(d.items(),key=lambda x: (-x[1],x[0])))
OrderedDict([((2, 1), 24), ((2, 2), 24), ((2, 3), 24), ((2, 4), 24), ((1, 1), 16), ((1, 2), 16), ((1, 3), 16), ((1, 4), 16)])
我们的主要排序键是每个值,通过用 -
取反每个值从高到低排序,然后我们用 key/tuple 从低到高排序打破平局。
按元组中的第二个元素断开连接:
pp(sorted(d.items(),key=lambda x:(-x[1],x[0][1])))
您编辑的输出现在有不同的键和不同的值,所以不确定 sort 如何做到这一点。