Python 从带有选项卡的2d列表中漂亮地打印表格

Python 从带有选项卡的2d列表中漂亮地打印表格,python,pretty-print,Python,Pretty Print,我试过使用,但在我的情况下,它们都没有帮助我 我的情况如下: left_headers = ['Numbers', 'Animals', 'Names', 'Flowers'] data = [ [1, 2, 3, 4, 5, 6], ['dog', 'cat', 'rabbit', 'elephant', 'hyena', 'kangaroo'], ['short name', 'a very long name', '123', 'some text', 'diffe

我试过使用,但在我的情况下,它们都没有帮助我

我的情况如下:

left_headers = ['Numbers', 'Animals', 'Names', 'Flowers']
data = [
    [1, 2, 3, 4, 5, 6],
    ['dog', 'cat', 'rabbit', 'elephant', 'hyena', 'kangaroo'],
    ['short name', 'a very long name', '123', 'some text', 'different name', 'another name'],
    ['tulip', 'cactus', 'daffodil', 'hydrangea', 'geranium', 'rose']
]
现在,我希望它以这种形式出现:

Numbers 1           2                   3           4           5               6
Animals dog         cat                 rabbit      elephant    hyena           kangaroo
Names   short name  a very long name    123         some text   different name  another name
Flowers tulip       cactus              daffodil    hydrangea   geranium        rose
数据由制表符而不是空格分隔。应调整所有开头字符

主要思想:标题在左侧。所有数据(和标题)由一些选项卡分隔。我的问题是,我不知道如何预测我需要多少选项卡来适应数据。我希望使用尽可能少的选项卡,以最小的空间容纳所有数据,但它应该至少有一个“空间”(比如“数字”和“1”)


编辑:我用了非常难看的代码。我添加了我的答案。

答案取决于所需的输出格式

1.使用一个选项卡(
\t
)分隔 通过制表符(
\t
)分隔,可以非常轻松地打印:

对于页眉,zip中的项目(左页眉,数据):
打印(标题'\t','\t'.join(映射(str,items)))
输出

Numbers          1      2       3       4       5       6
animals          dog    cat     rabbit  elephant        hyena   kangaroo
name     short name     a very long name        123     some text       different name  another name
flowers          tulip  cactus  daffodil        hydrangea       geranium        rose
简短解释
  • map(str,items)
    将项目列表转换为字符串列表(其中一个列表是整数,因此这是必需的)
  • '\t'.join(lst)
    从列表
    lst
    中的项目创建一个新字符串,并将它们与
    \t
    连接起来
  • zip(lst1,lst2)
    用于迭代两个列表,每次从每个列表中提取一个元素
2.带空格分隔(等宽列) 这是一艘有两条船的班轮

从表格导入表格
打印(制表(数据,showindex=左标题,tablefmt='plain'))
输出

Numbers  1           2                 3         4          5               6
animals  dog         cat               rabbit    elephant   hyena           kangaroo
name     short name  a very long name  123       some text  different name  another name
flowers  tulip       cactus            daffodil  hydrangea  geranium        rose
3.使用可变制表符分隔 这是最难的。您必须做的一件事是假设使用输出的程序如何处理制表器。这里假设“tab=4个空格”

导入数学
导入操作系统
每个选项卡的空间=4
表=[[str(项目)用于项目中的项目]用于数据中的项目]
对于页眉,zip中的项目(左页眉,表格):
项目。插入(0,标题)
偏移量表=[]#在选项卡中
对于zip中的列(*表):
长度=[len(x)表示x列]
单元格长度=数学单元格(最大(长度)/每个选项卡的空格)*每个选项卡的空格
偏移量_s=[单元_长度-长度表示长度]#在空间中
如果最小值(偏移量)=0,则其他选项卡=1,否则为0
偏移量=[math.ceil(o/SPACES\u PER\u TAB)+偏移量中o的附加\u TAB]
偏移量_表。追加(偏移量)
将open('table_out.txt','w')作为f:
对于zip(表格,zip(*偏移量表格))中的行偏移量:
对于项目,zip中的偏移量(行,行偏移量):
f、 写入(项目)
f、 写入('\t'*offset)
f、 写入('\n')
输出如下所示(复制到此处的选项卡看起来不太好,因此这里有一个来自Notepad++的打印屏幕)

简短解释
  • 首先,我们只创建一个名为
    table
    的表,其中包含标题和作为字符串的数据
  • 然后,我们计算单元的长度(以空间为单位),假设单元之间还有一个额外的空间。然后,如果某个单元在下一个单元之前没有空间,则添加一个额外的空间
  • 在这里,内置代码真正起作用了,例如,它用于通过
    zip(*lst)
    转换列表列表
  • 最后,将结果写入输出文件

答案取决于所需的输出格式

1.使用一个选项卡(
\t
)分隔 通过制表符(
\t
)分隔,可以非常轻松地打印:

对于页眉,zip中的项目(左页眉,数据):
打印(标题'\t','\t'.join(映射(str,items)))
输出

Numbers          1      2       3       4       5       6
animals          dog    cat     rabbit  elephant        hyena   kangaroo
name     short name     a very long name        123     some text       different name  another name
flowers          tulip  cactus  daffodil        hydrangea       geranium        rose
简短解释
  • map(str,items)
    将项目列表转换为字符串列表(其中一个列表是整数,因此这是必需的)
  • '\t'.join(lst)
    从列表
    lst
    中的项目创建一个新字符串,并将它们与
    \t
    连接起来
  • zip(lst1,lst2)
    用于迭代两个列表,每次从每个列表中提取一个元素
2.带空格分隔(等宽列) 这是一艘有两条船的班轮

从表格导入表格
打印(制表(数据,showindex=左标题,tablefmt='plain'))
输出

Numbers  1           2                 3         4          5               6
animals  dog         cat               rabbit    elephant   hyena           kangaroo
name     short name  a very long name  123       some text  different name  another name
flowers  tulip       cactus            daffodil  hydrangea  geranium        rose
3.使用可变制表符分隔 这是最难的。您必须做的一件事是假设使用输出的程序如何处理制表器。这里假设“tab=4个空格”

导入数学
导入操作系统
每个选项卡的空间=4
表=[[str(项目)用于项目中的项目]用于数据中的项目]
对于页眉,zip中的项目(左页眉,表格):
项目。插入(0,标题)
偏移量表=[]#在选项卡中
对于zip中的列(*表):
长度=[len(x)表示x列]
单元格长度=数学单元格(最大(长度)/每个选项卡的空格)*每个选项卡的空格
偏移量_s=[单元_长度-长度表示长度]#在空间中
如果最小值(偏移量)=0,则其他选项卡=1,否则为0
偏移量=[math.ceil(o/SPACES\u PER\u TAB)+偏移量中o的附加\u TAB]
偏移量_表。追加(偏移量)
将open('table_out.txt','w')作为f:
对于zip(表格,zip(*偏移量表格))中的行偏移量:
对于项目,zip中的偏移量(行,行偏移量):
f、 写入(项目)
f、 写入('\t'*offset)
f、 写入('\n')
输出如下所示(复制到此处的选项卡看起来不太好,因此这里有一个来自Notepad++的打印屏幕)

简短解释
  • 首先,我们只创建一个名为
    table
    的表,其中包含标题和作为字符串的数据
  • 然后,我们计算单元的长度(以空间为单位),假设单元之间还有一个额外的空间。然后,如果某个单元在下一个单元之前没有空间,则添加一个额外的空间
  • 在这里,内置代码真正起作用了,例如,它用于通过
    zip(*lst)
    转换列表列表
  • 最后,将结果写入输出文件

您可以使用熊猫来实现这一点:

import pandas as pd

left_headers = ['Numbers', 'animals', 'name', 'flowers']
data = [
    [1, 2, 3, 4, 5, 6],
    ['dog', 'cat', 'rabbit', 'elephant', 'hyena', 'kangaroo'],
    ['short name', 'a very long name', '123', 'some text', 'different name', 'another name'],
    ['tulip', 'cactus', 'daffodil', 'hydrangea', 'geranium', 'rose']
]

df = pd.DataFrame(data, index=left_headers)
print(df.to_string(header=False))
<
Numbers 1           2                   3           4           5               6               
Animals dog         cat                 rabbit      elephant    hyena           kangaroo        
Names   short name  a very long name    123         some text   different name  another name    
Flowers tulip       cactus              daffodil    hydrangea   geranium        rose