Преобразование 2d-словаря в матрицу numpy - программирование

Преобразование 2d-словаря в матрицу numpy

У меня есть огромный словарь примерно так:

d[id1][id2] = value

Пример:

books["auth1"]["humor"] = 20
books["auth1"]["action"] = 30
books["auth2"]["comedy"] = 20

и т.д.

Каждая из клавиш "auth" может иметь любой набор "жанров", связанных с ними. Значение для ключевого элемента - это количество написанных книг.

Теперь я хочу преобразовать его в виде матрицы... что-то вроде:

                    "humor"       "action"        "comedy"
      "auth1"         20            30               0
      "auth2"          0            0                20

Как мне это сделать? Благодаря

4b9b3361

Ответ 1

Используйте понимание списка, чтобы включить dict в список списков и/или массив numpy:

np.array([[books[author][genre] for genre in sorted(books[author])] for author in sorted(books)])

ИЗМЕНИТЬ

По-видимому, у вас есть нерегулярное количество ключей в каждом под-словаре. Составьте список всех жанров:

genres = ['humor', 'action', 'comedy']

И затем перебирайте словари обычным образом:

list_of_lists = []
for author_name, author in sorted(books.items()):
    titles = []
    for genre in genres:
        try:
            titles.append(author[genre])
        except KeyError:
            titles.append(0)
    list_of_lists.append(titles)

books_array = numpy.array(list_of_lists)

В основном я пытаюсь добавить значение из каждого ключа в genres в список. Если ключ отсутствует, он выдает ошибку. Я поймаю ошибку и добавлю вместо этого 0.

Ответ 2

pandas сделать это очень хорошо:

books = {}
books["auth1"] = {}
books["auth2"] = {}
books["auth1"]["humor"] = 20
books["auth1"]["action"] = 30
books["auth2"]["comedy"] = 20

from pandas import *

df = DataFrame(books).T.fillna(0)

Вывод:

       action  comedy  humor
auth1      30       0     20
auth2       0      20      0