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