shirop
shirop

Reputation: 107

Printing a list of dictionaries as a table

How can I format the below data into tabular form using Python ? Is there any way to print/write the data as per the expected format ?

[{"itemcode":null,"productname":"PKS543452","value_2018":null},
{"itemcode":null,"productname":"JHBG6%&9","value_2018":null},
{"itemcode":null,"productname":"VATER3456","value_2018":null},
{"itemcode":null,"productname":"ACDFER3434","value_2018":null}]

Expected output:

|itemcode | Productname | Value_2018 |
|null |PKS543452|null|
|null |JHBG6%&9|null|
|null |VATER3456|null|
|null |ACDFER3434|null|

Upvotes: 1

Views: 119

Answers (2)

hygull
hygull

Reputation: 8740

You can try like this as well (without using pandas). I have commented each and every line in code itself so don't forget to read them.

Note: Actually, the list/array that you have have pasted is either the result of json.dumps() (in Python, a text) or you have copied the API response (JSON).

null is from JavaScript and the pasted list/array is not a valid Python list but it can be considered as text and converted back to Python list using json.loads(). In this case, null will be converted to None.

And that's why to form the wanted o/p we need another check like "null" if d[key] is None else d[key].

import json

# `null` is used in JavaScript (JSON is JavaScript), so I considered it as string
json_text = """[{"itemcode":null,"productname":"PKS543452","value_2018":null},
{"itemcode":null,"productname":"JHBG6%&9","value_2018":null},
{"itemcode":null,"productname":"VATER3456","value_2018":null},
{"itemcode":null,"productname":"ACDFER3434","value_2018":null}]"""

# Will contain the rows (text)
texts = []

# Converting to original list object, `null`(JavaScript) will transform to `None`(Python)
l = json.loads(json_text)

# Obtain keys (Note that dictionary is an unorederd data type)
# So it is imp to get keys for ordered iteration in all dictionaries of list
# Column may be in different position but related data will be perfect
# If you wish you can hard code the `keys`, here I am getting using `l[0].keys()`
keys = l[0].keys()

# Form header and add to `texts` list
header = '|' + ' | '.join(keys) + " |"
texts.append(header)

# Form body (rows) and append to `texts` list
rows = ['| ' + "|".join(["null" if d[key] is None else d[key] for key in keys]) + "|" for d in l]
texts.extend(rows)

# Print all rows (including header) separated by newline '\n'
answer = '\n'.join(texts)
print(answer)

Output

|itemcode | productname | value_2018 |
| null|PKS543452|null|
| null|JHBG6%&9|null|
| null|VATER3456|null|
| null|ACDFER3434|null|

Upvotes: 1

glhr
glhr

Reputation: 4537

You can use pandas to generate a dataframe from the list of dictionaries:

import pandas as pd

null = "null"
lst = [{"itemcode":null,"productname":"PKS543452","value_2018":null},
{"itemcode":null,"productname":"JHBG6%&9","value_2018":null},
{"itemcode":null,"productname":"VATER3456","value_2018":null},
{"itemcode":null,"productname":"ACDFER3434","value_2018":null}]

df = pd.DataFrame.from_dict(lst)
print(df)

Output:

  itemcode productname value_2018
0     null   PKS543452       null
1     null    JHBG6%&9       null
2     null   VATER3456       null
3     null  ACDFER3434       null

This makes it easy to manipulate data in the table later on. Otherwise, you can print your desired output using built-in string methods:

output=[]
col_names = '|' + ' | '.join(lst[0].keys()) + '|' 
print(col_names)

for dic in lst:
    row = '|' + ' | '.join(dic.values()) + '|'
    print(row)

Output:

|itemcode | productname | value_2018|
|null | PKS543452 | null|
|null | JHBG6%&9 | null|
|null | VATER3456 | null|
|null | ACDFER3434 | null|

Upvotes: 2

Related Questions