按照第一列和接下来的列排序

5

我有一个需要排序的字典。我想按值对字典进行排序。如果两个键具有相同的值,则下一步我希望根据键的词典排序值进行排序。

我尝试了以下方法。

>>> l
{'a': 5, 'aa': 5, 'c': 1, 'b': 7}
>>> sorted(l)
['a', 'aa', 'b', 'c']
>>> sorted(l.items())
[('a', 5), ('aa', 5), ('b', 7), ('c', 1)]
>>> sorted(l.items(), reverse=True)
[('c', 1), ('b', 7), ('aa', 5), ('a', 5)]
>>> sorted(l.items(), key=l.get, reverse=True)
[('a', 5), ('aa', 5), ('c', 1), ('b', 7)]
>>> l
{'a': 5, 'aa': 5, 'c': 1, 'b': 7}
>>> 5>7
False
>>> sorted(l.items(), key=l.get, reverse=True)
[('a', 5), ('aa', 5), ('c', 1), ('b', 7)]
>>> sorted(l, key=l.get, reverse=True)
['b', 'a', 'aa', 'c']
>>> s=sorted(l, key=l.get, reverse=True)
>>> s
['b', 'a', 'aa', 'c']
>>> s.sort()
>>> s
['a', 'aa', 'b', 'c']
2个回答

5
如果我正确理解您的问题,您正在寻找类似以下内容的东西:
d = {'a': 5, 'aa': 5, 'c': 1, 'b': 7}
result = sorted(d.items(), key=lambda x: (x[1], x[0]))
print(result)

输出:

[('c', 1), ('a', 5), ('aa', 5), ('b', 7)]

如果您想要按升序排列值,并使第二次排序为降序,您可以使用以下方法:
d = {'a': 5, 'aa': 5, 'c': 1, 'b': 7}
result = sorted(d.items(), reverse=True, key=lambda x: (-x[1], x[0]))
print(result)

输出:

[('c', 1), ('aa', 5), ('a', 5), ('b', 7)]

若想了解排序的更多信息,请参阅排序指南


如果您有一个仅包含字符串的元组列表,可以进行如下操作:

l = [('foo', 'bar'), ('foo', 'spam'), ('baz', 'egg')]

result = sorted(l, key=lambda x: (x[0], [-ord(c) for c in x[1]]))
print(result)

输出:

[('baz', 'egg'), ('foo', 'spam'), ('foo', 'bar')]

是的,这就是我要找的。谢谢,我会测试答案并接受它。 - user2459905
2
顺便提一下,lambda函数可以被等效、更高效、稍微不那么明显的函数operator.itemgetter(1, 0)替代。 - Sven Marnach
@SvenMarnach,既然你这么说,我刚刚测试了用lambda函数来乘以列表元素。结果证明,在Python中使用for循环比lambda函数更有效率!再次感谢你的提醒。 - user2459905
@segfolt,我想在这里再添加一个问题,值应该是按升序排列,而第二次排序应该按降序排列。这是否可行? - user2459905
@segfolt,我这里有另一个问题。我找到了我要的东西。在这种情况下,键和值分别是字符串和数字。我可以轻松地执行-x [1]并得出解决方案。但是,如果键和值都是字符串,那么如何按升序对列进行排序,而另一列按降序排序。 - user2459905
@segfolt,非常感谢!我将立即接受这个答案。 - user2459905

1

以该顺序返回值和键:

sorted(l, key=lambda k: (l[k], k))

只针对键值,或者

sorted(l.items(), key=lambda i: i[::-1])

对于键值对,[::-1] 负步骤切片将反转值和键以进行排序。

这首先按照值进行排序,然后在值相等的情况下使用键。

结果:

>>> l = {'a': 5, 'aa': 5, 'c': 1, 'b': 7}
>>> sorted(l, key=lambda k: (l[k], k))
['c', 'a', 'aa', 'b']
>>> sorted(l.items(), key=lambda i: i[::-1])
[('c', 1), ('a', 5), ('aa', 5), ('b', 7)]

对于混合方向排序,需要将数值取反,并反转排序:

>>> sorted(d.items(), key=lambda i: (-i[1], i[0]), reverse=True)
[('c', 1), ('aa', 5), ('a', 5), ('b', 7)]

将数字取反会使它们按降序排序,而键保持升序;翻转则分别交换为升序和降序。

我想在这里添加另一个问题,值应该按升序排列,而第二个排序应该按降序排列。这样做可能吗? - user2459905

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