简体   繁体   中英

Pretty printing a list of list of floats?

Basically i have to dump a series of temperature readings, into a text file. This is a space delimited list of elements, where each row represents something (i don't know, and it just gets forced into a fortran model, shudder ). I am more or less handling it from our groups side, which is extracting those temperature readings and dumping them into a text file.

Basically a quick example is i have a list like this(but with alot more elements):

temperature_readings = [ [1.343, 348.222, 484844.3333], [12349.000002, -2.43333]]

In the past we just dumped this into a file, unfortunately there is some people who have this irritating knack of wanting to look directly at the text file, and picking out certain columns and changing some things (for testing.. i don't really know..). But they always complain about the columns not lining up properly, they pretty much the above list to be printed like this:

    1.343     348.222     484844.333
12349.000002   -2.433333

So those wonderful decimals line up. Is there an easy way to do this?

you can right-pad like this:

str = '%-10f' % val

to left pad:

set = '%10f' % val

or in combination pad and set the precision to 4 decimal places:

str = '%-10.4f' % val

:

import sys
rows = [[1.343, 348.222, 484844.3333], [12349.000002, -2.43333]]
for row in rows:
  for val in row:
    sys.stdout.write('%20f' % val)
  sys.stdout.write("\n")

        1.343000          348.222000       484844.333300
    12349.000002           -2.433330

The % (String formatting) operator is deprecated now.

You can use str.format to do pretty printing in Python.

Something like this might work for you:

for set in temperature_readings:
    for temp in set:
        print "{0:10.4f}\t".format(temp),
    print

Which prints out the following:

1.3430        348.2220      484844.3333
12349.0000         -2.4333

You can read more about this here: http://docs.python.org/tutorial/inputoutput.html#fancier-output-formatting

If you also want to display a fixed number of decimals (which probably makes sense if the numbers are really temperature readings), something like this gives quite nice output:

for line in temperature_readings:
   for value in line:
      print '%10.2f' % value,
   print

Output:

1.34     348.22  484844.33
  12349.00      -2.43

In Python 2.*,

for sublist in temperature_readings:
    for item in sublist:
        print '%15.6f' % item,
    print

emits

       1.343000      348.222000   484844.333300
   12349.000002       -2.433330

for your example. Tweak the lengths and number of decimals as you prefer, of course!

Check out Python pprint .

The pprint module provides a capability to “pretty-print” arbitrary Python data structures in a form which can be used as input to the interpreter.

[...]

This example demonstrates several uses of the pprint() function and its parameters.

>>> import pprint
>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
... ('parrot', ('fresh fruit',))))))))
>>> stuff = ['a' * 10, tup, ['a' * 30, 'b' * 30], ['c' * 20, 'd' * 20]]
>>> pprint.pprint(stuff)
['aaaaaaaaaa',
 ('spam',
  ('eggs',
   ('lumberjack',
    ('knights', ('ni', ('dead', ('parrot', ('fresh fruit',)))))))),
 ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
 ['cccccccccccccccccccc', 'dddddddddddddddddddd']]
>>> pprint.pprint(stuff, depth=3)
['aaaaaaaaaa',
 ('spam', ('eggs', (...))),
 ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
 ['cccccccccccccccccccc', 'dddddddddddddddddddd']]
>>> pprint.pprint(stuff, width=60)
['aaaaaaaaaa',
 ('spam',
  ('eggs',
   ('lumberjack',
    ('knights',
     ('ni', ('dead', ('parrot', ('fresh fruit',)))))))),
 ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
  'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
 ['cccccccccccccccccccc', 'dddddddddddddddddddd']]

Otherwise figure out what the longest number is in terms of character length and use Python's string substitution formatting options to make everything of the same length. Or use tabs as the separating characters. Lots of options!

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