Python中的二维表格式

1 投票
1 回答
6968 浏览
提问于 2025-04-17 02:16

我想把存储在字典里的数据做成一个二维表格的格式。

举个例子:

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

这是一个简单粗暴的实现(顺便纠正了你问题中的一些拼写错误...)

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(),这些方法可以在字符串的前面和/或后面添加字符,以强制设置字符串的总宽度。

除此之外,主要的思路是遍历列表或字典,并提取出值。

注意使用字典的方法get(),这个方法可以在某个键没有值时提供一个默认值。

撰写回答