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.
15 Answers
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 4You 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.
2A 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.
3pprint.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}} 1You 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 I prefer the clean formatting of yaml:
import yaml print(yaml.dump(cars)) output:
A: color: 2 speed: 70 B: color: 3 speed: 60 3for car,info in cars.items(): print(car) for key,value in info.items(): print(key, ":", value) 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]) Check the following one-liner:
print('\n'.join("%s\n%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 1Here 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) 1###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] """ # 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 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}} 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()] 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 1