按元组的第二个值排序dict或list,然后按第一个排序

时间:2020-07-15 15:35:36

标签: python

我不知道为什么我的代码不起作用,我有一个元组列表(或字典,我都尝试了),我想按元组的第二个值对它进行排序,以防万一2元组的第一个值与第二个值相同。我尝试过:

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()或dict,但一无所获。

问题可能是“反向真实”条件,但是我试图得到的是以下输出:[('oo', 11), ('aa', 10), ('ee', 10)]

基本上,我希望反真仅适用于lambda的第一个条件...有可能吗?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)]