Python列表加逗号插and功能实现,不解i <= len(name)-5条件生效原因
代码逻辑拆解
你贴的代码存在两个容易被忽略的问题,是这个巧合条件生效的核心原因:
- 缩进错误:
print(name[i], end=a)实际应该在for循环的缩进块内,否则只会打印最后一次循环的i对应的元素,根本无法得到预期输出,你本地运行的版本肯定是缩进正确的。 - 冗余操作:
name.append(a[len(a)-1])完全多余,后续的for循环遍历范围是range(len(name)-1),根本不会遍历到这个追加的元素,平白让name的总长度多了1。
测试用例的执行过程
你测试的输入是c = [1,2,3,4,5],我们一步步走流程:
- 初始
name = [1,2,3,4,5],深拷贝的a = [1,2,3,4,5] - 列表长度不等于1,在索引
len(name)-1 = 4的位置插入'and',此时name变为[1,2,3,4,'and',5],长度为6 - 执行冗余的
append操作,追加a的最后一个元素5,name变为[1,2,3,4,'and',5,5],总长度为7 - 进入
for循环,遍历范围是range(len(name)-1) = range(6),也就是i取0~5,刚好覆盖插入'and'后的6个有效元素,冗余追加的最后一个5不会被遍历到 - 条件判断
i <= len(name)-5,代入len(name)=7,得到i <= 2:- i=0、1、2时,end为逗号,对应输出
1,2,3, - i=3、4、5时,end为空,对应输出
4and5
拼接起来刚好符合你的预期结果。
- i=0、1、2时,end为逗号,对应输出
减5条件生效的本质是巧合
你原本的预期是「逗号仅添加到倒数第三个元素为止」,对应插入'and'后的有效列表长度是原长度+1,判断条件应该是i <= len(有效列表) - 3。但因为你多加了一个冗余的append操作,当前计算用的len(name) = len(有效列表) + 1,代入化简后刚好得到i <= len(name) -5的条件,在你测试的几个常见输入长度下都能凑出正确结果,换极端长度(比如长度为6的输入)就会出问题。
通用正确写法参考
def comma_code(name): # 空列表处理 if not name: print('') return # 单个元素直接打印 if len(name) == 1: print(name[0]) return # 前n-1个元素转字符串用逗号拼接,最后加and和末尾元素 print(', '.join(map(str, name[:-1])) + ', and ' + str(name[-1]))
内容的提问来源于stack exchange,提问作者Python
相关产品推荐
相关产品推荐

