Печать списка словарей в виде таблицы - PullRequest
1 голос
/ 01 мая 2019

Как я могу отформатировать приведенные ниже данные в табличную форму, используя Python?Есть ли способ напечатать / записать данные в соответствии с ожидаемым форматом?

[{"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}]

Ожидаемый вывод:

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

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Вы можете использовать pandas для генерации кадра данных из списка словарей:

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)

Выход:

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

Это облегчает манипулирование данными в таблице позже. В противном случае вы можете распечатать желаемый вывод, используя встроенные строковые методы:

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

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

Выход:

|itemcode | productname | value_2018|
|null | PKS543452 | null|
|null | JHBG6%&9 | null|
|null | VATER3456 | null|
|null | ACDFER3434 | null|
1 голос
/ 01 мая 2019

Так же можно попробовать (без использования панд ). Я прокомментировал каждую строку в самом коде, поэтому не забудьте прочитать их.

Примечание: На самом деле, вставленный вами список / массив является либо результатом json.dumps() (в Python, текст), либо вы скопировали ответ API (JSON).

null из JavaScript, и вставленный список / массив не является допустимым списком Python, но его можно рассматривать как текст и преобразовывать обратно в список Python с помощью json.loads(). В этом случае null будет преобразовано в None.

И вот почему для формирования требуемого o / p нам нужна еще одна проверка, например "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)

выход

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