Bill Waters
Bill Waters

Reputation: 291

How to print a nested python list in columns

I have a program that produces a python list as its output the list is a nested list: A list of the list [name, address, phone number] which I wish to be able to print in a columnar format. It seems upon stating the question to be a very simple Idea, but I have been unable to find a simple way to extract the data from the list. If I print(list), I get something like this: ['name','address','phone number'], etc. for each item in the list. I'm using Python 3 on a windows platform. Note: I am not a OOP programmer(at this point)

Regards Bill

Upvotes: 4

Views: 10165

Answers (5)

Imran
Imran

Reputation: 91119

prettytable can produce very nice looking ASCII tables. Example from the tutorial:

from prettytable import PrettyTable

x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"])
x.align["City name"] = "l" # Left align city names
x.add_row(["Adelaide",1295, 1158259, 600.5])
x.add_row(["Brisbane",5905, 1857594, 1146.4])
x.add_row(["Darwin", 112, 120900, 1714.7])
x.add_row(["Hobart", 1357, 205556, 619.5])
x.add_row(["Sydney", 2058, 4336374, 1214.8])
x.add_row(["Melbourne", 1566, 3806092, 646.9])
x.add_row(["Perth", 5386, 1554769, 869.4])
print x

Should print something like this

+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Adelaide  | 1295 |  1158259   |      600.5      |
| Brisbane  | 5905 |  1857594   |      1146.4     |
| Darwin    | 112  |   120900   |      1714.7     |
| Hobart    | 1357 |   205556   |      619.5      |
| Sydney    | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
| Perth     | 5386 |  1554769   |      869.4      |
+-----------+------+------------+-----------------+

Adapting this example for your use-case should be trivial.

Upvotes: 2

llb
llb

Reputation: 1741

The other answers given will truncate your records if they go over the field size. If you want them to wrap instead, you need to use the textwrap module.

import textwrap
import itertools

col_width = 20

header = ["Name", "Address", "Phone Number"]

def columnar_record(record):
    columns = (textwrap.wrap(item, col_width) for item in record)
    line_tuples = itertools.zip_longest(*columns, fillvalue="")
    lines = ("".join(item.ljust(col_width) for item in line_tuple)
             for line_tuple in line_tuples)
    return "\n".join(lines)

def print_columns(records):
    print(columnar_record(header))
    for record in records:
        print(columnar_record(record))

a = ["Bill Bradley", "123 North Main St., Anytown, NY 12345", "800-867-5309"]
b = ["John Doe", "800 South Main Street, Othertown, CA 95112", "510-555-5555"]

print_columns([a, b])

Upvotes: 0

Ashwini Chaudhary
Ashwini Chaudhary

Reputation: 251166

Iterate over the list like this:

for name,add,num in lis:
   print (name,add,num)

Demo:

>>> lis = [['name','address','phone number']]
>>> for name,add,num in lis:
...        print (name,add,num)
...     
name address phone number

You can also use string formatting for a better looking output:

>>> lis = [['name','address','phone number']]
>>> for name,add,num in lis:
       print ("{:<10}{:^20}{:^10}".format(name,add,num))
...     
name            address        phone number

Upvotes: 2

Guillaume
Guillaume

Reputation: 10971

You can use the print statement, for instance if you want all you fields to be 20 characters wide:

for e in list:
    name, address, phone = e
    print "%20s %20s %20s" % (name, address, phone)

Upvotes: 1

Maciej Gol
Maciej Gol

Reputation: 15864

for name, address, phone_number in a_list:
    print '{}\t{}\t{}'.format(name, address, phone_number)

Upvotes: 1

Related Questions