'How can I generalize getting values from a dictionary key?

I have a list of dictionaries such as:

[ {'Type': 'Water', 'Level': '8'}, {'Type': 'Fire', 'Level': '2'}, {'Type': 'Fire', 'Level': '8'}, ... ]

I have this code that basically prints it as a table:

my_list_of_dics = [ {'Type': 'Water', 'Level': '8'}, {'Type': 'Fire', 'Level': '2'}, {'Type': 'Fire', 'Level': '8'}]

#Initialize string
string_table = ""

#Print headers
for key in my_list_of_dics[0]:
    string_table += key + "\t"

#Jump line
string_table += "\n"

#Print values (rows), matching the header order and tabulations between each value and jump a line after each row
for row in my_list_of_dics:
    string_table += row['Type'] + "\t" + row['Level'] + "\n"

print(string_table)

Prints this:

Type  Level   
Water 8
Fire  2
Fire  8

It works as I want it, however I have to hardcode the names of the keys and the number of tabulations (+"\t") between each when printing it out.

Generating the headers of the table is fortunately generalized, however I haven't beeen able to generalize the printing key's values and the number of tabulations (as seen in my 2nd loop).



Solution 1:[1]

If all the dictionaries have the same keys, you can replace the line of code in your for loop with:

string_table += '\t'.join(row[key] for key in my_list_of_dics[0]) + '\n'

Note you can optimise this by defining

keys = list(my_list_of_dics[0].keys())

then you can just use

string_table += '\t'.join(row[key] for key in keys) + '\n'

and you can make the first line of the table with

string_table = '\t'.join(keys) + '\n'

Solution 2:[2]

You can use python format to create tables.

my_list_of_dics = [
    {"Type": "Water", "Level": "8"},
    {"Type": "Fire", "Level": "2"},
    {"Type": "Fire", "Level": "8"},
]

print("{:<10} {:<10}".format("Type", "Level"))
for val in my_list_of_dics:
    print("{:<10} {:<10}".format(val["Type"], val["Level"]))

will give us

Type       Level     
Water      8         
Fire       2         
Fire       8 

More generalized form

my_list_of_dics = [
    {"Type": "Water", "Level": "8"},
    {"Type": "Fire", "Level": "2"},
    {"Type": "Fire", "Level": "8"},
]

get_keys = list(my_list_of_dics[0].keys())
fmt = "{:<10}" * len(get_keys)
print(fmt.format(*get_keys))
for val in my_list_of_dics:
    print(fmt.format(*val.values()))

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Nick
Solution 2