How to print a dictionary line by line in Python?
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
Related videos on Youtube
Jett
Updated on July 18, 2022Comments
-
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 over 10 yearsAnd 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 almost 10 yearsWhy not just use
pprint.pprint()
here then? -
user2007447 over 9 yearsalmost made a JSON creator, no?
-
Darrel Holt about 8 yearsI 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 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 over 7 years@theprowler The closest I can get to recreating the problem is if
cars = {1:4, 2:5}
thencars[x]
is an integer mapped to the keyx
rather than a set mapped to the keyx
. In this case, you don't need to use thefor 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 over 7 yearsHmm. 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 about 6 yearstrue, 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 about 6 yearsWhat did you modify? What's the output?
-
not2qubit over 5 yearsNice one, but I tried to convert it to use this with
sys.modules
, but I failed. Wanna have a go at it? -
Boris Verkhovskiy about 4 yearsI do
print(json.dumps(cars, indent=4, ensure_ascii=False))
because otherwise non-ASCII characters are unreadable. -
Boris Verkhovskiy about 4 yearsYou have to
pip install PyYAML
first. -
not2qubit over 3 yearsI 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 over 3 yearsunlike
pprint
example above, this seem to break when there are lists nested within dicts. -
not2qubit over 3 yearsThis 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 over 3 yearsVery nice and compact solution. Just had to add the
print
statement.