Skip to main content
 首页 » 编程设计

python之根据最后 3 个字符对文本进行排序

2025年05月04日22qlqwjy

我正在使用 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"])) 

请您参考如下方法:

您可以使用:

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

因此我们首先计算字符串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' 可以重新排序) ,你可以使用更优雅的方法:

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)