如何基于不同长度的列表生成二维列表适配Rich库表格?
不同长度列表对齐生成二维行列表方案
需求场景
现有四个长度不一致的列表:
apps = ["App 1", "App 2", "App 3", "App 4"] devices = ["device1"] groups = ["group1", "group2", "group3", "group4"] rules_name = ["rule1", "rule2", "rule3", "rule4", "rule5"]
需要生成二维列表rows,将各列表对应索引的元素放在同一行,长度不足的位置用None填充,行数由最长的原列表决定,最终用于Rich库构建表格。
最优解决方案:使用itertools.zip_longest
Python标准库的itertools.zip_longest专门处理不同长度迭代器的对齐问题,指定fillvalue=None即可自动填充缺失项:
from itertools import zip_longest apps = ["App 1", "App 2", "App 3", "App 4"] devices = ["device1"] groups = ["group1", "group2", "group3", "group4"] rules_name = ["rule1", "rule2", "rule3", "rule4", "rule5"] # 生成目标二维列表 rows = list(zip_longest(apps, devices, groups, rules_name, fillvalue=None))
执行后rows的结果完全符合需求:
[ ("App 1", "device1", "group1", "rule1"), ("App 2", None, "group2", "rule2"), ("App 3", None, "group3", "rule3"), ("App 4", None, "group4", "rule4"), (None, None, None, "rule5") ]
如果需要列表而非元组,可再套一层列表推导:
rows = [list(item) for item in zip_longest(apps, devices, groups, rules_name, fillvalue=None)]
手动实现方案(不依赖标准库)
如果不想用itertools,可以手动计算最长列表长度,逐索引取值填充:
apps = ["App 1", "App 2", "App 3", "App 4"] devices = ["device1"] groups = ["group1", "group2", "group3", "group4"] rules_name = ["rule1", "rule2", "rule3", "rule4", "rule5"] # 找到最长列表的长度 max_length = max(len(apps), len(devices), len(groups), len(rules_name)) rows = [] for i in range(max_length): # 按索引取值,超出长度则用None填充 row = [ apps[i] if i < len(apps) else None, devices[i] if i < len(devices) else None, groups[i] if i < len(groups) else None, rules_name[i] if i < len(rules_name) else None ] rows.append(row)
在Rich库中使用
生成rows后,直接传给Rich表格的add_rows方法即可:
from rich.table import Table from rich.console import Console from itertools import zip_longest # 生成rows代码同上 rows = list(zip_longest(apps, devices, groups, rules_name, fillvalue=None)) console = Console() table = Table(title="应用规则配置") table.add_column("应用") table.add_column("设备") table.add_column("分组") table.add_column("规则") # 批量添加行 table.add_rows(rows) console.print(table)
也可以循环调用add_row:
for row in rows: table.add_row(*row)
内容的提问来源于stack exchange,提问作者glob
相关产品推荐
相关产品推荐

