Как напечатать словарь списков строк - PullRequest
1 голос
/ 01 февраля 2020

У меня есть словарь словарей списков целых. Я хочу, чтобы l oop проходил через каждый словарь и создавал таблицу, в которой для оси y задано имя списка, а для оси x - произвольные имена.

a = {'john': {'alex': [5, 6], 'bono': [0, 4]}, 'jane': {'alex': [0, 1], 'bono': [0, 1]}}

for k, v in a.items():
    print('\n' + k)
    for k, v in v.items():
        print(k, v)

Текущий вывод:

john
alex [5, 6]
bono [0, 4]

jane
alex [0, 1]
bono [0, 1]

Мой желаемый вывод:

john   col1 col2
alex   5    6
bono   0    4

jane | col1 col2
-----------------
alex | 0    1
bono | 0    1

Число столбцов (col1 и col2) фиксировано. (Эффекты в таблице Джейн являются необязательными, могут жить без них!).

Редактировать: Я ищу решение, отличное от pandas (модуль импорта).

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

РЕДАКТИРОВАТЬ:

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

# your original data:
outer_name_dictionary = {'john': {'alexis': [5, 6], 'bonofide': [0, 4]}, 'jane doe': {'alex': [0, 1], 'bono': [0, 1]}}

# iterate over each outer dictionary:
for key, value in outer_name_dictionary.items():

    # get inner dictionary:
    inner_name_dictionary = value

    # print the column headers, you can change the '10' to a larger number ...
    # but do the same with the print function below:
    print('%10s | col0  col1' %key)
    print(' '*6 + '-'*18)

    # iterate over ech inner dictionary:
    for inner_key, inner_value in inner_name_dictionary.items():

        # print the column values:
        print('%10s | %4d  %4d' %(inner_key, inner_value[0], inner_value[1]))

    print()

Вывод:

      john | col0  col1
      ------------------
    alexis |    5     6
  bonofide |    0     4

  jane doe | col0  col1
      ------------------
      alex |    0     1
      bono |    0     1

Pandas решение:

import pandas as pd

# your original data:
name_dictionary = {'john': {'alex': [5, 6], 'bono': [0, 4]}, 'jane': {'alex': [0, 1], 'bono': [0, 1]}}

# iterate over each inner dictionary:
for name in name_dictionary:

    # convert each inner dictionary to a dataframe:
    name_dataframe = pd.DataFrame(name_dictionary[name])

    # transpose dataframe:
    name_dataframe = name_dataframe.T

    # assign original name to name of columns in dataframe:
    name_dataframe.columns.name = name

    # rename columns:
    name_dataframe = name_dataframe.rename(columns={
            0 : 'col0',
            1 : 'col1',
    })

    # print results:
    print(name_dataframe)
    print()
0 голосов
/ 01 февраля 2020

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

for head, d in a.items():
    print(head, "col1", "col2", sep='\t')
    for name, lst in d.items():
        print(name, *lst, sep='\t')

Это дает в вашем примере словарь:

john    col1    col2
alex    5   6
bono    0   4
jane    col1    col2
alex    0   1
bono    0   1

Для выравнивания аккуратнее вы можете играть с f-строки:

cell_size = 6
for head, d in a.items():
    print(f"{head:{cell_size}} {'col1':{cell_size}} {'col2':{cell_size}}")
    for name, lst in d.items():
        print(f"{name:{cell_size}} {lst[0]:<{cell_size}} {lst[1]:<{cell_size}}", end='')

, которые теперь дают:

john   col1   col2  
alex   5      6      
bono   0      4      
jane   col1   col2  
alex   0      1      
bono   0      1     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...