How to print a dictionary line by line in Python?

775,493

Solution 1

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

output:

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

Solution 2

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 json

cars = {'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.

Solution 3

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:

A
color : 2
speed : 70
B
color : 3
speed : 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 sys

def 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:

test
1 : 3
test3
(1, 2)
abc
def
ghi
(4, 5) : def
test2
(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.

Solution 4

pprint.pprint() is a good tool for this job:

>>> import pprint
>>> cars = {'A':{'speed':70,
...         'color':2},
...         'B':{'speed':60,
...         'color':3}}
>>> pprint.pprint(cars, width=1)
{'A': {'color': 2,
       'speed': 70},
 'B': {'color': 3,
       'speed': 60}}

Solution 5

You have a nested structure, so you need to format the nested dictionary too:

for key, car in cars.items():
    print(key)
    for attribute, value in car.items():
        print('{} : {}'.format(attribute, value))

This prints:

A
color : 2
speed : 70
B
color : 3
speed : 60
Share:
775,493

Related videos on Youtube

Jett
Author by

Jett

Updated on July 18, 2022

Comments

  • Jett
    Jett almost 2 years

    This is the dictionary

    cars = {'A':{'speed':70,
            'color':2},
            'B':{'speed':60,
            'color':3}}
    

    Using this for loop

    for keys,values in cars.items():
        print(keys)
        print(values)
    

    It prints the following:

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

    But I want the program to print it like this:

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

    I just started learning dictionaries so I'm not sure how to do this.

  • MrWonderful
    MrWonderful over 10 years
    And if the format is not overly strict, one could also use 'print json.dumps(obj, indent=3)'. That gives a reasonable representation of most structures, though it does choke (in my environment) on my less-trivial example due to the use of a tuple as a key...
  • Martijn Pieters
    Martijn Pieters almost 10 years
    Why not just use pprint.pprint() here then?
  • user2007447
    user2007447 over 9 years
    almost made a JSON creator, no?
  • Darrel Holt
    Darrel Holt about 8 years
    I know this is old, but I thought it would be worth mentioning that this doesn't work if cars[x] is integers. It isn't what the OP was requesting, so I'm just saying it for anybody that stumbles upon this assuming it's a blanket solution.
  • theprowler
    theprowler over 7 years
    @DarrelHolt do you know how to make it work with integers? Because that's the problem I'm currently facing
  • Darrel Holt
    Darrel Holt over 7 years
    @theprowler The closest I can get to recreating the problem is if cars = {1:4, 2:5} then cars[x] is an integer mapped to the key x rather than a set mapped to the key x. In this case, you don't need to use the for y in cars[x]: line because there's only one value you're retrieving, unless you're using something like a list or set of integers then it should work. Sorry, it's been a few months so I can't completely remember how I came to the conclusion of my previous comment. You could send me your code and I can see if I'm any help.
  • theprowler
    theprowler over 7 years
    Hmm. I think my problem is even worse than that. Basically I've parsed out some data from an HTML table, and I happened to store it in a dictionary, and now I'm trying to take that dictionary data and put it into a DataFrame before I export it all to an Oracle table....it's pretty in depth I know, but the step that is holding me up right now is putting the data into a DataFrame....my dictionary for some reason has one key and all the data is in values, so it's difficult trying to put it neatly into rows and columns..
  • Buffalo Rabor
    Buffalo Rabor about 6 years
    true, the contents of the dict must be serializable into json, however, the output provided here is far cleaner (e.g., human readable) than output produced by the pprint.PrettyPrinter. specifically in the area of consistent indentation and discarding of string prefixes such as u'foo'.
  • Andreas Haferburg
    Andreas Haferburg about 6 years
    What did you modify? What's the output?
  • not2qubit
    not2qubit over 5 years
    Nice one, but I tried to convert it to use this with sys.modules, but I failed. Wanna have a go at it?
  • Boris Verkhovskiy
    Boris Verkhovskiy about 4 years
    I do print(json.dumps(cars, indent=4, ensure_ascii=False)) because otherwise non-ASCII characters are unreadable.
  • Boris Verkhovskiy
    Boris Verkhovskiy about 4 years
    You have to pip install PyYAML first.
  • not2qubit
    not2qubit over 3 years
    I don't see how this is simpler than other answers. Certainly not for readability. Also would be great to see some example output from this.
  • not2qubit
    not2qubit over 3 years
    unlike pprint example above, this seem to break when there are lists nested within dicts.
  • not2qubit
    not2qubit over 3 years
    This seem to be the simplest and best solution by far, as it can also handle sets, tuples and lists when nested in the dict.
  • SaTa
    SaTa over 3 years
    Very nice and compact solution. Just had to add the print statement.