如何将一维列表按两列输出?解决索引越界问题
解决一维列表两列输出的索引越界问题
嘿,我一眼就看到你代码里的问题啦——为啥会报Index out of range?因为你在遍历元素的时候,每次都去取data_list[item+1],但当item走到列表最后一个元素的索引时,item+1就超出列表的最大索引了呀!比如你的data_list有11个元素,最大索引是10,当item=10的时候,item+1=11,这时候肯定找不到对应的元素,直接报错。而且原来的遍历逻辑还会重复处理元素(比如item=1时处理了1和2,item=2又会处理2和3),这完全不是你想要的两列排版效果。
我给你改了代码,同时优化了逻辑,来看看吧:
spacing = '- ' * 25 data_list = [ "NAMES", "Rudolph S.", "Josef M.", "Joye A.", "Joni M.", "Rachelle L.", "Vena U.", "Efrain L.", "Mee H.", "Tanya E.", "Garrett H." ] while True: fname_prompt = input("First Name: ").strip().capitalize() if fname_prompt in ("List", "list", "LIST"): # 把表头和内容分开,逻辑更清晰 header = data_list[0] name_list = data_list[1:] # 打印表头区域 print(spacing) print('{:>27s}'.format(header)) print(spacing) # 按每两个元素一组处理,步长设为2避免索引越界 for i in range(0, len(name_list), 2): # 取当前组的第一个名字 first_name = name_list[i] # 如果有第二个名字就取,没有就留空(处理奇数个元素的情况) second_name = name_list[i+1] if (i+1) < len(name_list) else "" # 格式化输出:左对齐第一个,右对齐第二个 print('{:<10s}{:>20s}'.format(first_name, second_name)) # 打印完列表就退出循环,也可以根据需求保留循环 break # 加个退出选项,不然会无限循环哦 elif fname_prompt == "Exit": print("退出程序~") break
关键改进点:
- 分离表头与内容:把
data_list[0]单独拿出来当表头,剩下的元素专门处理排版,逻辑更清晰 - 步长遍历避免越界:用
range(0, len(name_list), 2)来按两元素一组遍历,不会出现访问不存在的索引的情况 - 兼容奇数个元素:判断
i+1是否在列表范围内,不存在就给第二个位置留空,保证格式统一 - 简化格式化逻辑:原来的格式化是嵌套拼接,现在直接在一个格式化字符串里传入两个参数,简洁又不容易出错
这样修改后,你的列表就能完美按两列输出,再也不会报索引越界的错误啦!
内容的提问来源于stack exchange,提问作者McBraunie
相关产品推荐
相关产品推荐

