2014-10-20 123 views
4

这是产生我输出的最pythonic方式。让我说明我试图达到的行为。 对于我的项目我建立一个函数,它采用不同的参数来打印列中的输出。 其收到的列表示例。用列表打印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'] 

列表中的第一个元组声明所谓的“Header字段”,如列表示例所示。 对于这种情况,只有3个项目,但这可能会不时有所不同。所以我试着用下面的公式计算物品的尺寸:

length_container_header = len(container[0]) 

这个变量可以用来正确地建立输出。 构建标题“打印”我会构建这样的东西。

print("{:21} {:7} {:7}".format(header_field[0], header_field[1], header_field[2])) 

现在这是一个应该如何使用的手册。正如您注意到标题字段“字段”短于列表中的 PointerToSymbolTable。我写此函数来确定在列表中

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} 

这是部分是一遇到麻烦,我如何能产生格式字符串的最后一部分? 我在格式()函数中尝试了一个嵌套的for循环,但我最终发现了各种错误。我认为这可以通过 for循环完成,我只是无法弄清楚。如果有人能够将我推向正确的方向打印标题,我将非常感激。一旦我想出如何打印标题,我几乎可以弄清楚其余部分。我希望我解释的不够好

随着亲切的问候,

+1

http://www.programmingforums.org/post195293.html看看底部有一定的了解。你可以使用你的格式作为例子中的'row'变量。然后遍历列表来获取每行,这将是'args'。 – 2014-10-20 17:24:09

+0

“格式字符串的最后部分”是什么意思?你能举一个简单的例子吗? – goncalopp 2014-10-20 17:25:38

+0

我认为他不知道如何将他的列表值应用于格式。但是,我不完全确定。那里有很多话。 – 2014-10-20 17:26:06

回答

2

You can use * to unpack argument list

container = [ 
    ('Field', 'Integer', 'Hex'), 
    ('Machine;', 332, '0x14c'), 
    ('NumberOfSections;', 9, '0x9'), 
    ('Time Date Stamp;', 4, '0x4'), 
    ('PointerToSymbolTable;', 126976, '0x1f000') 
] 
lengths = [ 
    max(len(str(row[i])) for row in container) for i in range(len(container[0])) 
] # => [21, 7, 7] 
# OR lengths = [max(map(len, map(str, x))) for x in zip(*container)] 
fmt = ' '.join('{:<%d}' % l for l in lengths) 
# => '{:<21} {:<7} {:<7}' # < for left-align 

print(fmt.format(*container[0])) # header 
print('-' * (sum(lengths) + len(lengths) - 1)) # separator 
for row in container[1:]: 
    print(fmt.format(*row)) # <------- unpacking argument list 
    # similar to print(fmt.format(row[0], row[1], row[2]) 

输出:

Field     Integer Hex 
------------------------------------- 
Machine;    332  0x14c 
NumberOfSections;  9  0x9 
Time Date Stamp;  4  0x4 
PointerToSymbolTable; 126976 0x1f000 
+0

谢谢,永远不知道*存在。哦,并感谢长度功能,更短 – See 2014-10-20 17:39:13

0

我不知道这是否是“Python化”,但您可以使用pandas来格式化输出。

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) 

结果:

    Field Integer  Hex 
       Machine;  332 0x14c 
    NumberOfSections;  9  0x9 
     Time Date Stamp;  4  0x4 
PointerToSymbolTable; 126976 0x1f000 
+0

我不知道那里...酷。http://pandas.pydata.org/ – 2014-10-20 17:32:23

0

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

  1. 确定字段布局,即表示数据行或列明智。根据您的决定,您可能需要使用zip
  2. 转置数据确定字段大小。除非你不对字段大小进行硬编码(不推荐),否则应根据数据确定最大字段大小,以便在字段之间进行自定义填充。通常这需要读取数据并确定字段的最大长度[len(max(map(str, field), key = len)) + pad for field in zip(*data)]
  3. 提取标题行。这很容易,因为它只需要索引第0行,即data[0]
  4. 格式化数据。这需要python format string

实施

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