Python print with a list

What is the most pythonic way to draw my conclusion. Let me illustrate the behavior I'm trying to achieve. For my project, I create a function that takes different parameters to output the output in columns. An example of a list that it receives.

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

** The size of the elements may vary (only 3 elements per tuple can now be 4 for another list or any number **

The result should be something like this.

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

For work purposes, I created a list that contains only header fields: This is not necessary, but it made it a little easier to try

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]))

, . , "" , 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}

, ? format(), . , , . - , . , , . , .

,

+4
3

* :

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
+2

, "Pythonic", 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
+1

.

  • , . zip
  • . ( ), , . , [len(max(map(str, field), key = len)) + pad for field in zip(*data)]
  • . , 0- , .. data[0]
  • . python

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))

Demo

for row in FormatTable(data):
    print row

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

All Articles