2014-10-20 86 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