Python 按字母顺序对元组列表排序(区分大小写)

Python 按字母顺序对元组列表排序(区分大小写),python,list,sorting,tuples,Python,List,Sorting,Tuples,我有一个元组列表 alist = [(u'First', 23), (u'Second', 64),(u'last', 19)] 我想按字母顺序(区分大小写)排序,以获得以下信息: (u'last', 19), (u'First', 23), (u'Second', 64) (u'last', 19), (u'Second', 64), (u'First', 23), 我试过这个: sorted(alist, key=lambda x: x[0], reverse= True) 不幸的是

我有一个元组列表

alist = [(u'First', 23), (u'Second', 64),(u'last', 19)]
我想按字母顺序(区分大小写)排序,以获得以下信息:

(u'last', 19), (u'First', 23), (u'Second', 64)
(u'last', 19), (u'Second', 64), (u'First', 23),
我试过这个:

sorted(alist, key=lambda x: x[0], reverse= True)
不幸的是,我明白了:

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

包括一个键,指示第一个字符是否为大写:

>>> 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
之前,因此小写首字母的单词将排序在大写首字母的单词之前。单词按字典顺序进行排序。

定义您自己的排序功能:

字符通过其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)]

这将无法根据字符串中的第二个和后续字符进行正确排序。对于类似
last
last
@NedBatchelder的情况,这将失败:这完全取决于OP对输入字符串中大写字符超过第一个的数据进行排序的期望。以及是什么使您的输出正确分类为什么不先排序
“FirSt”
last?它的大写字母比
'Second'
多。@MartijnPieters因为按字母顺序
'S'
'F'
之后,所以不需要检查其他字母。我的观点是这是您的解释。可能还有其他原因,我们没有足够的示例数据来确定这一点。