简体   繁体   中英

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

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

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.

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

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)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM