Python 按字母顺序对字符串元组进行排序,按字母顺序对字符串元组进行反向排序';

Python 按字母顺序对字符串元组进行排序,按字母顺序对字符串元组进行反向排序';,python,string,sorting,Python,String,Sorting,假设您有一个元组列表(姓氏、名),您希望按姓氏的字母顺序对其进行反向排序,然后如果两个人的名字相同,则按姓氏的字母顺序对其进行排序。有没有一条线可以做到这一点 e、 g 有两行代码,我想您可以依赖排序稳定性,首先按名字排序,然后按姓氏反向排序 有没有一条线可以做到这一点 有两行代码,我想您可以依赖排序稳定性,首先按名字排序,然后按姓氏反向排序 你可以在一行中做到这一点: sorted(sorted(names, key=lambda name: name[1]), key=lambda name

假设您有一个元组列表(姓氏、名),您希望按姓氏的字母顺序对其进行反向排序,然后如果两个人的名字相同,则按姓氏的字母顺序对其进行排序。有没有一条线可以做到这一点

e、 g

有两行代码,我想您可以依赖排序稳定性,首先按名字排序,然后按姓氏反向排序

有没有一条线可以做到这一点

有两行代码,我想您可以依赖排序稳定性,首先按名字排序,然后按姓氏反向排序

你可以在一行中做到这一点:

sorted(sorted(names, key=lambda name: name[1]), key=lambda name: name[0], reverse=True)
在中对该问题进行两次排序(“要按年级降序然后按年龄升序对学生数据进行排序,请先进行年龄排序,然后使用年级再次排序”)


一个愚蠢的选择是只使用一个
排序的

sorted(names, key=lambda name: ([-ord(c) for c in name[0]], name[1])) == correct
sorted(names, lambda a, b: cmp(b[0], a[0]) or cmp(a, b))

Python2解决方案,其中一个
已排序
cmp
而不是

sorted(names, key=lambda name: ([-ord(c) for c in name[0]], name[1])) == correct
sorted(names, lambda a, b: cmp(b[0], a[0]) or cmp(a, b))

是的,您可以依靠分拣的稳定性:

names=[('Zane','Albert'),('Zane','Bart'),('Python','Alex'),('Python','Monty')]
names.sort()
names.sort(reverse=True,key=lambda i:i[0])

这里有一个
itertools.groupby
解决方案:

从itertools导入groupby
从运算符导入itemgetter
li=[('x','y'),('s','e'),('s','a'),('x','z')]
[p代表k,g代表groupby(排序(li,reverse=True),itemgetter(0))代表p代表reversed(list(g))]
#[('x','y'),('x','z'),('s','a'),('s','e')]

是。。。这是默认排序。。。你不需要任何东西
sorted(names)
@JoranBeasley不是真的。@JoranBeasley姓氏他们想要降序。@JoranBeasley你认为字符串的负数是什么?@JoranBeasley不适用于字符串
Traceback(最近的调用Last):文件“”,第1行,在名称2中。排序(key=lambda x:(-x[0],x[1])文件“”,第1行,在名称2中。排序(key=lambda x:(-x[0],x[1])类型错误:一元数的操作数类型错误-:'str'
谢谢;当您完成任务时,我已经输入了一半。我的回答不再有用,除了。@Seraphya Ok,我刚刚添加了一个排序解决方案。@Prune谢谢,包括这一点。仅供参考:添加了排序稳定性和Python 2.2