You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动