Python格式化字符串使用列表负索引触发类型错误的原因及解决方法
Python字符串格式化中负索引报错的原因与解决方法
问题原因
str.format()的占位符语法里,{some_list[-1]}并不会被解析为用整数-1索引列表,而是会把-1当作字符串键去尝试访问列表。因为列表只能用整数或切片索引,所以触发TypeError: list indices must be integers or slices, not str。
而正索引能正常工作,是因为格式化语法会自动把{some_list[0]}里的0转换为整数索引,负号则会被视为标识符的一部分,导致整个-1被识别成字符串。
解决方法
方法1:提前提取元素
先获取列表的负索引元素,再传入格式化方法:
some_list = [0, 1, 2] format_str_1 = 'some_list[-1] is {}' print(format_str_1.format(some_list[-1])) # 输出:some_list[-1] is 2
方法2:使用f-string(推荐)
Python 3.6及以上支持的f-string会直接解析表达式,完美支持负索引:
some_list = [0, 1, 2] print(f'some_list[-1] is {some_list[-1]}') # 输出:some_list[-1] is 2
方法3:自定义可兼容的包装类(适合必须用str.format()的场景)
如果一定要用str.format(),可以把列表包装成一个能将字符串索引转为整数的类:
class IndexableList: def __init__(self, lst): self.lst = lst def __getitem__(self, key): # 尝试把字符串键转为整数 if isinstance(key, str): try: key = int(key) except ValueError: pass return self.lst[key] format_str_1 = 'some_list[-1] is {some_list[-1]}' print(format_str_1.format(some_list=IndexableList([0, 1, 2]))) # 输出:some_list[-1] is 2
内容的提问来源于stack exchange,提问作者gg99
相关产品推荐
相关产品推荐

