根据最后的第3个字符排序文字

时间:2017-08-06 14:56:39

标签: python python-3.x sorting

我使用sorted()函数根据最后一个字符对文本进行排序 哪作得很好

def sort_by_last_letter(strings):
    def last_letter(s):
        return s[-1]
    return sorted(strings,key=last_letter)

print(sort_by_last_letter(["hello","from","last","letter","a"]))

输出

['a', 'from', 'hello', 'letter', 'last']

我的要求是根据最后的第3个字符进行排序。但问题是少数字少于3个字符,在这种情况下,它应该根据下一个较低位置的字符排序(如果存在其他最后2个字符)。搜索要做它用pythonic方式

目前我正在

IndexError:字符串索引超出范围

def sort_by_last_letter(strings):
    def last_letter(s):
        return s[-3]
    return sorted(strings,key=last_letter)

print(sort_by_last_letter(["hello","from","last","letter","a"]))

2 个答案:

答案 0 :(得分:3)

您可以使用:

return sorted(strings,key=lambda x: x[max(0,len(x)-3)])

因此,我们首先计算字符串len(x)的长度并从中减去3。如果字符串不长,我们将获得一个否定索引,但是通过使用max(0,..)我们可以防止它,从而获取最后一个,或者最后一个字符,以防它们不存在。

这将有效,因为每个字符串至少有一个字符。这将产生:

>>> sorted(["hello","from","last","letter","a"],key=lambda x: x[max(0,len(x)-3)])
['last', 'a', 'hello', 'from', 'letter']

如果您不关心打破平局(换句话说,如果'a''abc'可以重新排序),您可以使用更优雅的方法:< / p>

from operator import itemgetter

return sorted(strings,key=itemgetter(slice(-3,None)))

我们这里做的是生成一个包含最后三个字符的切片,然后比较这些子串。然后生成:

>>> sorted(strings,key=itemgetter(slice(-3,None)))
['a', 'last', 'hello', 'from', 'letter']

因为我们比较:

   ['a', 'last', 'hello', 'from', 'letter']
#  ['a',  'ast',   'llo',  'rom',    'ter'] (comparison key)

答案 1 :(得分:2)

您可以简单地使用字符串长度的最小值和3:

def sort_by_last_letter(strings):
    def last_letter(s):
        return s[-min(len(s), 3)]
    return sorted(strings,key=last_letter)

print(sort_by_last_letter(["hello","from","last","letter","a"]))