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

4

我有一个元组列表

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个回答

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


这不会根据字符串中的第二个及其后续字符进行正确排序。 - Ned Batchelder
这将无法适用于像 lastlaSt 这样的内容。 - Ashwini Chaudhary
@NedBatchelder:这完全取决于OP对于排序具有大写字符的输入字符串除第一个字符外的数据期望是什么。 - Martijn Pieters

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)]

你的输出为什么是正确的排序呢?为什么不把 'FirSt' 排在最后?它比 'Second' 有更多的大写字母。 - Martijn Pieters
@MartijnPieters 因为按字母顺序来看,'S'在'F'之后,所以不需要检查其他字母。 - Ashwini Chaudhary
我的观点是那是你的解释。可能会有其他的解释,但我们没有足够的示例数据来确定。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接