我使用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"]))
答案 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"]))