How to print a dictionary line by line in Python? How to print a dictionary line by line in Python? python python

How to print a dictionary line by line in Python?


for x in cars:    print (x)    for y in cars[x]:        print (y,':',cars[x][y])

output:

Acolor : 2speed : 70Bcolor : 3speed : 60


You could use the json module for this. The dumps function in this module converts a JSON object into a properly formatted string which you can then print.

import jsoncars = {'A':{'speed':70, 'color':2},        'B':{'speed':60, 'color':3}}print(json.dumps(cars, indent = 4))

The output looks like

{    "A": {        "color": 2,        "speed": 70    },    "B": {        "color": 3,        "speed": 60    }}

The documentation also specifies a bunch of useful options for this method.


A more generalized solution that handles arbitrarily-deeply nested dicts and lists would be:

def dumpclean(obj):    if isinstance(obj, dict):        for k, v in obj.items():            if hasattr(v, '__iter__'):                print k                dumpclean(v)            else:                print '%s : %s' % (k, v)    elif isinstance(obj, list):        for v in obj:            if hasattr(v, '__iter__'):                dumpclean(v)            else:                print v    else:        print obj

This produces the output:

Acolor : 2speed : 70Bcolor : 3speed : 60

I ran into a similar need and developed a more robust function as an exercise for myself. I'm including it here in case it can be of value to another. In running nosetest, I also found it helpful to be able to specify the output stream in the call so that sys.stderr could be used instead.

import sysdef dump(obj, nested_level=0, output=sys.stdout):    spacing = '   '    if isinstance(obj, dict):        print >> output, '%s{' % ((nested_level) * spacing)        for k, v in obj.items():            if hasattr(v, '__iter__'):                print >> output, '%s%s:' % ((nested_level + 1) * spacing, k)                dump(v, nested_level + 1, output)            else:                print >> output, '%s%s: %s' % ((nested_level + 1) * spacing, k, v)        print >> output, '%s}' % (nested_level * spacing)    elif isinstance(obj, list):        print >> output, '%s[' % ((nested_level) * spacing)        for v in obj:            if hasattr(v, '__iter__'):                dump(v, nested_level + 1, output)            else:                print >> output, '%s%s' % ((nested_level + 1) * spacing, v)        print >> output, '%s]' % ((nested_level) * spacing)    else:        print >> output, '%s%s' % (nested_level * spacing, obj)

Using this function, the OP's output looks like this:

{   A:   {      color: 2      speed: 70   }   B:   {      color: 3      speed: 60   }}

which I personally found to be more useful and descriptive.

Given the slightly less-trivial example of:

{"test": [{1:3}], "test2":[(1,2),(3,4)],"test3": {(1,2):['abc', 'def', 'ghi'],(4,5):'def'}}

The OP's requested solution yields this:

test1 : 3test3(1, 2)abcdefghi(4, 5) : deftest2(1, 2)(3, 4)

whereas the 'enhanced' version yields this:

{   test:   [      {         1: 3      }   ]   test3:   {      (1, 2):      [         abc         def         ghi      ]      (4, 5): def   }   test2:   [      (1, 2)      (3, 4)   ]}

I hope this provides some value to the next person looking for this type of functionality.