按元组第二个值排序字典或列表,然后再按第一个值排序。

3

我不明白为什么我的代码不起作用,我有一个元组列表(或字典,我都试过),我想按元组的第二个值排序,并在第二个值相同时按第一个值排序。我尝试了以下代码:

sorted(my_list, key=lambda k: (k[1], k[0]), reverse=True)

但是我得到的列表只按第二个值排序...例如,对于这个列表:
l = [('ee',10), ('oo',11), ('aa', 10)]

我得到了这个输出:[('oo', 11), ('ee', 10), ('aa', 10)],但按字典序来看,'aa'应该在'ee'之前... 我做错了什么?我尝试使用my_list.sort()或者使用一个字典但都没有成功。问题可能在于"reverse True"条件上,但我想要的输出是:[('oo', 11), ('aa', 10), ('ee', 10)],基本上只希望将reverse true应用于lambda表达式的第一个条件...这可行吗?

1
您正在进行逆序排序,因此输出是正确的。您是否想按与第一列相反的顺序对第二列进行排序? - Pynchia
是的...你懂了,我该怎么做? - C-Gian
2个回答

2
您可以按照以下方式进行操作:
output = sorted(l, key=lambda x: (x[1], [-ord(letter) for letter in x[0]]), reverse=True)

output 包含以下内容:

[('oo', 11), ('aa', 10), ('ee', 10)]

我们保持倒序(降序)排序,但将列表作为第二个选项传递(这些列表也按字典顺序由Python比较),用于排序的每个字母都有负ASCII值。这样,-ord('a')(-97)大于-ord('e')(-101)。

0

我想你应该删除reverse=True选项,这样值就会按照“正确”的顺序排序。

>>> l = [('ee',10), ('oo',11), ('aa', 10)]
>>> sorted(l, key=lambda k: (k[1], k[0]), reverse=False)
[('aa', 10), ('ee', 10), ('oo', 11)]

但我需要它按降序排列,基本上只针对第一个条件(x [1]),而第二个条件(x [0])按正常顺序排列。 - C-Gian
抱歉,在测试时我错过了重点。:\ - FrancescoLS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接