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.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 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
Method 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.
Method 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.
Method 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}}
Method 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
Method 6
I prefer the clean formatting of yaml:
import yaml print(yaml.dump(cars))
output:
A: color: 2 speed: 70 B: color: 3 speed: 60
Method 7
for car,info in cars.items():
print(car)
for key,value in info.items():
print(key, ":", value)
Method 8
This will work if you know the tree only has two levels:
for k1 in cars:
print(k1)
d = cars[k1]
for k2 in d
print(k2, ':', d[k2])
Method 9
Check the following one-liner:
print('n'.join("%sn%s" % (key1,('n'.join("%s : %r" % (key2,val2) for (key2,val2) in val1.items()))) for (key1,val1) in cars.items()))
Output:
A speed : 70 color : 2 B speed : 60 color : 3
Method 10
Here is my solution to the problem. I think it’s similar in approach, but a little simpler than some of the other answers. It also allows for an arbitrary number of sub-dictionaries and seems to work for any datatype (I even tested it on a dictionary which had functions as values):
def pprint(web, level):
for k,v in web.items():
if isinstance(v, dict):
print('t'*level, f'{k}: ')
level += 1
pprint(v, level)
level -= 1
else:
print('t'*level, k, ": ", v)
Method 11
###newbie exact answer desired (Python v3):
###=================================
"""
cars = {'A':{'speed':70,
'color':2},
'B':{'speed':60,
'color':3}}
"""
for keys, values in reversed(sorted(cars.items())):
print(keys)
for keys,values in sorted(values.items()):
print(keys," : ", values)
"""
Output:
B
color : 3
speed : 60
A
color : 2
speed : 70
##[Finished in 0.073s]
"""
Method 12
# Declare and Initialize Map
map = {}
map ["New"] = 1
map ["to"] = 1
map ["Python"] = 5
map ["or"] = 2
# Print Statement
for i in map:
print ("", i, ":", map[i])
# New : 1
# to : 1
# Python : 5
# or : 2
Method 13
Use this.
cars = {'A':{'speed':70,
'color':2},
'B':{'speed':60,
'color':3}}
print(str(cars).replace(",", ",n"))
output:
{'A': {'speed': 70,
'color': 2},
'B': {'speed': 60,
'color': 3}}
Method 14
I think list comprehension is the cleanest way to do this:
mydict = {a:1, b:2, c:3}
[(print("key:", key, end='t'), print('value:', value)) for key, value in mydict.items()]
Method 15
Modifying MrWonderful code
import sys
def print_dictionary(obj, ident):
if type(obj) == dict:
for k, v in obj.items():
sys.stdout.write(ident)
if hasattr(v, '__iter__'):
print k
print_dictionary(v, ident + ' ')
else:
print '%s : %s' % (k, v)
elif type(obj) == list:
for v in obj:
sys.stdout.write(ident)
if hasattr(v, '__iter__'):
print_dictionary(v, ident + ' ')
else:
print v
else:
print obj
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0