问题
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
回答1:
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
回答2:
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.
回答3:
for name, address, phone_number in a_list:
print '{}\t{}\t{}'.format(name, address, phone_number)
回答4:
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)
回答5:
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])
来源:https://stackoverflow.com/questions/17514935/how-to-print-a-nested-python-list-in-columns