按字母顺序(大小写敏感)排序元组列表

4 投票
2 回答
2005 浏览
提问于 2025-04-17 18:24

我有一个元组的列表

alist = [(u'First', 23), (u'Second', 64),(u'last', 19)]

我想按字母顺序(并且区分大小写)进行排序,得到这个结果:

(u'last', 19), (u'First', 23), (u'Second', 64)

我试过这样做:

sorted(alist, key=lambda x: x[0], reverse= True)

但不幸的是,我得到了这个结果:

(u'last', 19), (u'Second', 64), (u'First', 23),

2 个回答

0

定义你自己的排序函数:

字符的比较是根据它们的ascii值来进行的,所以 'A'(65)总是比 'a'(97)小。不过,你可以通过让 'a' 的值比 'A' 小来改变这个比较方式。

In [39]: lis=[(u'First', 23),(u'laSt',1), (u'Second', 64),(u'last', 19),(u'FirSt',5)]

In [40]: def mysort(x):
    elem=x[0]
    return [ord(x)-97 if x.islower() else ord(x)  for x in elem]
   ....: 

In [41]: sorted(lis,key=mysort)
Out[41]: [(u'last', 19), (u'laSt', 1), (u'First', 23), (u'FirSt', 5), (u'Second', 64)]
9

加入一个标记,用来表示第一个字母是否是大写:

>>> sorted([(u'First', 23), (u'Second', 64),(u'last', 19)], key=lambda t: (t[0][0].isupper(), t[0]))
[(u'last', 19), (u'First', 23), (u'Second', 64)]

False 会排在 True 前面,所以以小写字母开头的单词会排在以大写字母开头的单词前面。其他的单词则按照字母顺序进行排序。

撰写回答