2D таблица формата Python - PullRequest
       4

2D таблица формата Python

1 голос
/ 14 сентября 2011

Я хочу создать 2D-формат таблицы из моих данных, хранящихся в словаре.

Пример:

d = {'ID1':[('Experiment1', 40), (Experiment2, 59), (Experiment3, 65)],    
 'ID2':[('Experiment1', 68), (Experiment2, 21), (Experiment3, 39)],   
 'ID3':[('Experiment1', 57), (Experiment2, 15), (Experiment4, 99)]}

Должен дать следующую таблицу:

    Experiment1     Experiment2     Experiment3     Experiment4

ID1 ... 40 ................................ 59 ...............................65 ................................ ''
ID2 .... 68 ............................... 21 ................................ 39 ................................ ''
ID3 ....57 ............................... 15 ................................''.................................. 99

Где IDx - метки строк, а Experimentx - имена столбцов.Если в наборе данных нет значения для имени столбца, то в качестве заполнителя следует добавить пустую строку.

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

1 Ответ

4 голосов
/ 14 сентября 2011

Быстрая и грязная реализация (исправление опечаток в вопросе ...)

d = {'ID1':[('Experiment1', 40), ('Experiment2', 59), ('Experiment3', 65)],    
 'ID2':[('Experiment1', 68), ('Experiment2', 21), ('Experiment3', 39)],   
 'ID3':[('Experiment1', 57), ('Experiment2', 15), ('Experiment4', 99)]}

COLUMN_WIDTH = 20
STRING_WHEN_MISSING = '""'
PADDING_STRING = "."


#first determine what are the columns - from the first line
columns = ["id"] #there is always at least the id column
columns = columns + [colName for (colName, colValue) in d.items()[0][1]]

print "".join([ col.ljust(COLUMN_WIDTH) for col in columns])

#browse the lines, order by ID Ascending
for (rowId, rowValues) in sorted(d.items(), key= lambda x: x[0].lower()):
    #print rowId
    #print rowValues
    rowValuesDict = dict(rowValues) #make it a dict with access by key
    rowValuesDict["id"] = rowId
    #print rowValuesDict
    print "".join([ str(rowValuesDict.get(col, STRING_WHEN_MISSING)).ljust(COLUMN_WIDTH, PADDING_STRING) for col in columns])

Это напечатает:

id                  Experiment1         Experiment2         Experiment3         
ID1.................40..................59..................65..................
ID2.................68..................21..................39..................
ID3.................57..................15..................""..................

Примечание:

Формат вашего оригинального словаря немного странный ... Я бы ожидал большего примерно так:

d = [('ID1',{'Experiment1': 40, 'Experiment2':59, 'Experiment3':65}),    
     ('ID2',{'Experiment1': 68, 'Experiment2':21, 'Experiment3':39})] 

Некоторые комментарии:

Для такого рода вещей вы хотите прочитать о некоторыхСтроковые методы Python: center (), ljust () и rjust () , которые добавляют символы до и / или после строки, чтобы увеличить ее общую ширину.

Исходя из этого, идея состоит в том,в основном о циклическом просмотре списков / словарей и извлечении значений.

Обратите внимание на использование метода dict get () , который позволяет иметь значение по умолчанию, если для данного ключа не существует значения.

...