Python格式的列表打印

Python格式的列表打印,python,string,list,format,Python,String,List,Format,这是产生我的输出的最具python风格的方式。让我来举例说明我试图实现的行为。 对于我的一个项目,我正在构建一个函数,该函数使用不同的参数来打印列中的输出。 其接收的列表的示例 [('Field', 'Integer', 'Hex'), ('Machine;', 332, '0x14c'), ('NumberOfSections;', 9, '0x9'), ('Time Date Stamp;', 4, '0x4'), ('PointerToSymbolTable;', 126976,

这是产生我的输出的最具python风格的方式。让我来举例说明我试图实现的行为。 对于我的一个项目,我正在构建一个函数,该函数使用不同的参数来打印列中的输出。 其接收的列表的示例

[('Field', 'Integer', 'Hex'), 
('Machine;', 332, '0x14c'), 
('NumberOfSections;', 9, '0x9'), 
('Time Date Stamp;', 4, '0x4'), 
('PointerToSymbolTable;', 126976, '0x1f000')
**项目的大小可以不同(现在每个元组只有3个项目,对于其他列表或任何数字,可以是4个项目)**

输出应该是这样的

Field                                                     Integer      Hex           
-------------------------------------------------------------------------------
Machine;                                                  332          0x14c        
NumberOfSections;                                         9            0x9          
Time Date Stamp;                                          4            0x4          
PointerToSymbolTable;                                     126976       0x1f000
出于工作目的,我创建了一个只包含标题字段的列表: 这是没有必要的,但它使它更容易尝试的东西了

Header field is ['Field', 'Integer', 'Hex']  
列表中的第一个元组声明了所谓的“头字段”,如列表示例所示。 在这种情况下,只有3个项目,但这可能会因时间而异。因此,我尝试使用以下公式计算项目的大小:

length_container_header = len(container[0])
此变量可用于正确建立输出。 构建标题“print”我会构建类似这样的东西

print("{:21} {:7} {:7}".format(header_field[0], header_field[1], header_field[2]))
现在,这是一个关于它应该如何的手动版本。正如您所注意到的,标题字段“field”比 我编写这个函数是为了确定列表中每个位置的最长项

container_lenght_list = []    
    local_l = 0    
    for field in range(0, lenght_container_body):
        for item in container[1:]:
            if len(str(item[field])) > local_l:
                local_l = len(str(item[field]))
            else:
                continue
        container_lenght_list.append(str(local_l))
        local_l = 0
在这种情况下,生成一个类似于[21,7,7]的列表。 创建格式字符串非常简单

formatstring = ""

for line in lst:
    formatstring+= "{:" + str(line) +"}"
它生成字符串:

 {:21}{:7}{:7}
这是一个遇到麻烦的部分,如何生成格式字符串的最后一部分? 我在format()函数中尝试了一个嵌套的for循环,但最终还是出现了各种各样的错误 对于loop,我只是不知道该怎么做。如果有人能把我推到正确的方向来打印页眉,我将非常感激。一旦我知道如何打印页眉,我就可以大致了解其余的内容。我希望我能解释得足够好

恕我直言,

我不知道它是否是“Pythonic”,但您可以使用它来格式化输出

import pandas as pd

data = [('Field', 'Integer', 'Hex'),
('Machine;', 332, '0x14c'),
('NumberOfSections;', 9, '0x9'),
('Time Date Stamp;', 4, '0x4'),
('PointerToSymbolTable;', 126976, '0x1f000')]

s = pd.DataFrame(data[1:], columns=data[0])
print s.to_string(index=False)
结果:

字段整数十六进制
机器;332 0x14c
NumberOfSections;9 0x9
时间日期戳;4 0x4
指针符号表;126976 0x1f000


以表格形式格式化数据需要四个重要步骤

  • 确定字段布局,即按行或按列表示数据。根据决定,您可能需要使用
    zip
  • 确定字段大小。除非您想硬编码字段大小(不推荐),否则您实际上应该根据数据确定最大字段大小,允许在字段之间进行自定义填充。通常这需要读取数据并确定字段的最大长度
    [len(max(map(str,field),key=len))+pad
    对于zip(*数据)中的字段)
  • 提取标题行。这很容易,因为它只需要索引第0行,即
    数据[0]
  • 格式化数据。这需要对
  • 实施

    class FormatTable(object):
        def __init__(self, data, pad = 2):
            self.data = data
            self.pad = pad
            self.header = data[0]
            self.field_size = [len(max(map(str, field), key = len)) + pad 
                               for field in zip(*data)]
            self.format = ''.join('{{:<{}}}'.format(s) for s in self.field_size)
        def __iter__(self):
            yield ''.join(self.format.format(*self.header))
            yield '-'*(sum(self.field_size) + self.pad * len(self.header))
            for row in data[1:]:
                yield ''.join(self.format.format(*row))
    

    查看底部。在示例中,您将使用格式作为
    变量。然后循环遍历列表以获得每一行,这将是
    参数
    。您所说的“格式字符串的最后一部分”到底是什么意思?你能举个简单的例子吗?我想他不知道如何将他的列表值应用到格式中。但是,是的,我不完全确定。上面有很多单词。是的,格式后面的部分(,将尝试您的链接Lossy thkxThanks,从不知道*的存在。它在Lossy中。企鹅的链接也是。哦,感谢长度函数,非常短。您正在使用另一个库“Pandas”!可接受的解决方案是纯python!
    Field                 Integer Hex
    -------------------------------------
    Machine;              332     0x14c
    NumberOfSections;     9       0x9
    Time Date Stamp;      4       0x4
    PointerToSymbolTable; 126976  0x1f000
    
    class FormatTable(object):
        def __init__(self, data, pad = 2):
            self.data = data
            self.pad = pad
            self.header = data[0]
            self.field_size = [len(max(map(str, field), key = len)) + pad 
                               for field in zip(*data)]
            self.format = ''.join('{{:<{}}}'.format(s) for s in self.field_size)
        def __iter__(self):
            yield ''.join(self.format.format(*self.header))
            yield '-'*(sum(self.field_size) + self.pad * len(self.header))
            for row in data[1:]:
                yield ''.join(self.format.format(*row))
    
    for row in FormatTable(data):
        print row
    
    Field                  Integer  Hex      
    -----------------------------------------------
    Machine;               332      0x14c    
    NumberOfSections;      9        0x9      
    Time Date Stamp;       4        0x4      
    PointerToSymbolTable;  126976   0x1f000