Python CLI输出内容按3列排版实现方案咨询
实现CLI菜单的3列排版输出
嘿,我来帮你搞定这个3列菜单的问题!你现在的代码是每条记录单独打印一行,要改成3列并排的话,我们可以调整输出逻辑——不用每循环一次就立刻打印,而是先把要显示的菜单条目攒起来,凑够3个就拼成一行输出,最后再处理剩下不足3个的情况。
方案一:先收集所有条目再分块输出
这种方法逻辑更清晰,先把所有要显示的菜单字符串收集起来,再按3个一组拆分输出,还能顺便用enumerate替代手动维护索引的麻烦:
# pull all our installs _ins = self._db.get_all_installs() # 存储所有菜单字符串 menu_items = [] # 存储可选的wpe_id _selectable = [] # 用enumerate自动获取从1开始的索引,替代手动维护_idx for idx, _row in enumerate(_ins, start=1): _wpe_id = _row[2] _name = _row[3] _environ = _row[4] # 构建菜单字符串 menu_str = f"{idx}) {_name} - {_environ}" menu_items.append(menu_str) _selectable.append(_wpe_id) # 设置列数 columns = 3 # 每3个条目为一组,循环输出 for i in range(0, len(menu_items), columns): # 取出当前组的条目 current_group = menu_items[i:i+columns] # 格式化每一列,用固定宽度左对齐(这里设为40,可根据你的内容调整) formatted_line = "\t".join(f"{item:<40}" for item in current_group) print(formatted_line)
方案二:循环中实时攒条目输出
如果不想提前收集所有条目,也可以在循环过程中实时攒够3个就打印一行:
# pull all our installs _ins = self._db.get_all_installs() _selectable = [] # 临时存储当前行的条目 current_line = [] for idx, _row in enumerate(_ins, start=1): _wpe_id = _row[2] _name = _row[3] _environ = _row[4] menu_str = f"{idx}) {_name} - {_environ}" _selectable.append(_wpe_id) current_line.append(menu_str) # 每3个条目打印一行 if idx % 3 == 0: # 格式化并打印当前行 formatted_line = "\t".join(f"{item:<40}" for item in current_line) print(formatted_line) # 重置临时列表 current_line = [] # 处理最后剩余的不足3个的条目 if current_line: formatted_line = "\t".join(f"{item:<40}" for item in current_line) print(formatted_line)
关键细节说明
- 用
enumerate(_ins, start=1)可以自动生成从1开始的索引,比手动维护_idx变量更简洁、不易出错,这是Python里的常用技巧。 f"{item:<40}"是格式化字符串的左对齐语法,40代表每个条目占40个字符宽度,你可以根据自己的实际内容长度调整这个数值,保证列与列之间对齐整齐。- 两种方案都能实现你要的3列效果,选哪种取决于你的偏好——方案一适合需要后续复用菜单条目的场景,方案二更节省内存(不过300多条数据的话,内存差异可以忽略)。
内容的提问来源于stack exchange,提问作者Kevin




