按字母顺序排序字符串元组并按字母顺序反转'

时间:2017-03-21 00:10:40

标签: python string sorting

假设您有一个元组列表(last_name,first_name),并且您希望按last_name字母顺序对它们进行排序,然后如果两个人具有相同的名称,则按名字的字母顺序对它们进行排序。有没有办法用一行做到这一点?

e.g。

Sorted(names, key = ?) = [('Zane', 'Albert'), ('Zane', 'Bart'), ('Python', 'Alex'), ('Python', 'Monty')]

有两行,我猜你可以依赖排序稳定性,先按名字排序,然后按姓氏颠倒排序。

3 个答案:

答案 0 :(得分:2)

  

有没有办法用一行做到这一点?

     

有两行,我猜你可以依赖排序稳定性,先按名字排序,然后按姓氏颠倒排序。

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

sorted(sorted(names, key=lambda name: name[1]), key=lambda name: name[0], reverse=True)

Sorting Mini-HOW TO"按降级和升序年龄对学生数据进行排序)对这个问题进行两种排序,先按年龄排序,然后再使用等级排序&# 34。

只用一个sortedkey

来做一个愚蠢的替代方案
sorted(names, key=lambda name: ([-ord(c) for c in name[0]], name[1])) == correct

Python 2解决方案,其中包含一个sortedcmp而不是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])