假设您有一个元组列表(last_name,first_name),并且您希望按last_name字母顺序对它们进行排序,然后如果两个人具有相同的名称,则按名字的字母顺序对它们进行排序。有没有办法用一行做到这一点?
e.g。
Sorted(names, key = ?) = [('Zane', 'Albert'), ('Zane', 'Bart'), ('Python', 'Alex'), ('Python', 'Monty')]
有两行,我猜你可以依赖排序稳定性,先按名字排序,然后按姓氏颠倒排序。
答案 0 :(得分:2)
有没有办法用一行做到这一点?
有两行,我猜你可以依赖排序稳定性,先按名字排序,然后按姓氏颠倒排序。
嗯,你可以在一行中做到这一点:
sorted(sorted(names, key=lambda name: name[1]), key=lambda name: name[0], reverse=True)
在Sorting Mini-HOW TO("按降级和升序年龄对学生数据进行排序)对这个问题进行两种排序,先按年龄排序,然后再使用等级排序&# 34。)
只用一个sorted
和key
sorted(names, key=lambda name: ([-ord(c) for c in name[0]], name[1])) == correct
Python 2解决方案,其中包含一个sorted
和cmp
而不是key
:
sorted(names, lambda a, b: cmp(b[0], a[0]) or cmp(a, b))
答案 1 :(得分:1)
这是一个itertools.groupby
解决方案:
from itertools import groupby
from operator import itemgetter
li = [('x', 'y'), ('s', 'e'), ('s, 'a'), ('x', 'z')]
[p for k, g in groupby(sorted(li, reverse=True), itemgetter(0)) for p in reversed(list(g))]
# [('x', 'y'), ('x', 'z'), ('s', 'a'), ('s', 'e')]
答案 2 :(得分:0)
是的,您可以依赖分类的稳定性:
names = [('Zane', 'Albert'), ('Zane', 'Bart'), ('Python', 'Alex'), ('Python', 'Monty')]
names.sort()
names.sort(reverse=True, key=lambda i: i[0])