Объедините несколько списков (одинаковой длины), хранящихся в dict, в один список - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть следующий словарь (который по сути напоминает таблицу):

tbl = {'col0':[20, 30, 22, 15, 24],
       'col1':[13, 15, 10, 14, 15],
       'col2':[52, 12, 14, 36, 23] }

Я хочу преобразовать это в list of list, который объединяет весь список по столбцам (т.е. одни и те же элементы индекса становятся одним элемент списка в списке списка)

Это должно выглядеть примерно так:

[[20, 13, 52], [30, 15, 12], [22, 10, 14], [15, 14, 36], [24, 15, 23]]

это также должно работать в ситуациях, когда мой dict будет выглядеть примерно так:

tbl = {'col0':1.0,
       'col1':7.0,
       'col2':1.3 }

# converted into
[[1.0, 7.0, 1.3]]

есть ли способ Pythoni c сделать это? Мне в основном это нужно для печати структуры таблицы по строкам путем переопределения метода __str__ для структуры, которая в настоящее время хранит значения таблицы в dict формате

Ответы [ 2 ]

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

Вы всегда можете использовать нечитаемое понимание двойного списка!

my_list_of_lists = [[tbl[key][idx] for key in tbl] for idx in range(len(tbl[list(tbl.keys())[0]]))]

Если у вас могут быть данные без длины, вы можете использовать их вместо этого (если все столбцы имеют одинаковую длину):

def len_checker(item):
    try:
        return len(item)
    except:
        return 0

my_list_of_lists = [[tbl[key][idx] for key in tbl] for idx in range(len(tbl[list(tbl.keys())[0]]))] if len_checker(tbl[list(tbl.keys())[0]]) else [[tbl[key] for key in tbl]]

Разве это не весело?

Все немного чище, если вы можете гарантировать, что ключ 'col0' находится в вашем столе.

my_list_of_lists = [[tbl[key][idx] for key in tbl] for idx in range(len(tbl['col0']))] if len_checker(tbl['col0']) else [[tbl[key] for key in tbl]]

Во всех Серьезность, однако, если вы хотите чистый код, вы должны использовать что-то вроде Pandas DataFrame.

from pandas import DataFrame

try:
    df = DataFrame(tbl)
except:
    df = DataFrame(tbl,index=[0])
my_list_of_lists = [list(df.iloc[row]) for row in range(df.shape[0])]

Вы также можете использовать numpy.

import numpy as np

arr = np.vstack([np.array(tbl[key]) for key in tbl])
my_list_of_lists = [list(arr[...,col]) for col in range(arr.shape[1])]
0 голосов
/ 29 февраля 2020

zip удобно для этого:

>>> list(zip(*tbl.values()))
[(20, 13, 52), (30, 15, 12), (22, 10, 14), (15, 14, 36), (24, 15, 23)]

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

>>> list(list(x) for x in zip(*tbl.values()))
[[20, 13, 52], [30, 15, 12], [22, 10, 14], [15, 14, 36], [24, 15, 23]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...