将列表的字典打印为网格布局

时间:2017-02-22 09:17:36

标签: python pandas dictionary grid-layout pretty-print

好的,我以前读过所有这些,我认为大熊猫可能是一个解决方案,但我的问题略有不同:
Print a dictionary of lists vertically
Printing Lists as Tabular Data
print dictionary values which are inside a list in python
Print a dictionary into a table

我有一份清单:

dict={"A":[i1, i2,i3], "B":[i1, i4,i5], "C":[i1, i2,i5]}

我想要的输出是:

    i1    i2    i3    i4    i5   
A    x     x     x     -     -   
B    x     -     -     x     x   
C    x     x     -     -     x  

(甚至更好,

    i1    i2    i3    i4    i5  
A    A     A     A     -     -  
B    B     -     -     B     B  
C    C     C     -     -     C  

或与另一个字典中的A,B,C或(A,in)匹配的值, 但如果我只能拥有第一张桌子,我会非常高兴)

没有列表包含重复,但这些列表中的每个元素都是从同一个列表中提取的(实际上我的问题是使用相应的蛋白质制作带注释的术语网格,关键是带注释的术语,这些是与这些蛋白质相关的功能在我的研究中)。

我确实可以想到一种复杂的方法(建立0和1的向量,用于将每个列表与一般列表进行比较,将这些向量与键相关联,将其放入一个pandas DataFrame中,该格式将由我的魔力重建了每个列表中的大量实体,并打印出来),但这看起来很乏味/单调。

我认为必须有一种已知的方法来做一些模块(熊猫,漂亮,其他?);我只是不知道。 因此,我很高兴有任何见解。感谢

3 个答案:

答案 0 :(得分:5)

带有apply

lambda

d = {
    "A": ['i1', 'i2', 'i3'],
    "B": ['i1', 'i4', 'i5'],
    "C": ['i1', 'i2', 'i5']
}

df = pd.DataFrame(d)

df.apply(lambda c: pd.Series(c.name, c.values)).fillna('-').T

  i1 i2 i3 i4 i5
A  A  A  A  -  -
B  B  -  -  B  B
C  C  C  -  -  C

答案 1 :(得分:1)

只是一个简单的草稿(基于很多str.format):

def create_table(dictionary, columns):
    column_set = set(columns)  # only to speed up "in" calls, could be omitted
    # Fill in the symbols depending on the presence of the corresponding columns
    filled_dct = {key: [' X' if col in lst else ' -' for col in column_set] 
                  for key, lst in dct.items()}

    # A template string that is filled for each row
    row_template = '   '.join(['{}']*(len(columns)+1))

    print(row_template.format(*([' '] + columns)))
    for rowname, rowcontent in sorted(filled_dct.items()):
        print(row_template.format(*([rowname] + rowcontent)))

dct = {"A": ['i1', 'i2', 'i3'], 
       "B": ['i1', 'i4', 'i5'], 
       "C": ['i1', 'i2', 'i5']}

columns = ['i1', 'i2', 'i3', 'i4', 'i5']

create_table(dct, columns)
    i1   i2   i3   i4   i5
A    X    X    -    -    X
B    X    -    X    X    -
C    X    X    X    -    -

虽然它不是很灵活(可变列宽等),但应该很容易扩展。

答案 2 :(得分:1)

考虑你的输入字典:

dic = {"A":["i1", "i2", "i3"], "B":["i1", "i4", "i5"], "C":["i1", "i2", "i5"]}

使用dict.fromkeys(),以便迭代变为dic(又名dic.values())内的值list,其默认值为{{1} } key(又名dic's)。

字典理解的帮助下,在最后一步计算的结果将构成数据帧的值。转置它以使列标题成为索引轴,反之亦然。

稍后,按dic.keys()填写Nans

"-"

enter image description here