【发布时间】:2016-08-14 20:59:46
【问题描述】:
我正在尝试为我的数据创建相关矩阵/列联表样式输出。我正在使用包含(不同数量)集群的重叠度量的字典。
overlap={(0,0): 0.5, (1,0):0.2, (1,1):0.0}
重叠 btw 集群“0”和“0”是 0.5,等等。 现在我想这样输出:
0 1
0 0.5 0.2
1 0.2 0
我认为这很容易,但我完全被困在这一点上。 这是我到目前为止所做的:我得到了我的行和列。
t=overlap.items()
column_names=[i[0][0] for i in t]
rows=[[i[0][1], i[1]] for i in t]
我制作了一个字符串模板来填充这些值:
template="{}\t"*len(column_names)
然后我尝试通过写出列名并遍历行来填充它。那就是我卡住的时候:
print template.format(??)
for row in rows:
print template.format(??)
我不知道怎么做
让
format逐个接受列表(列或行)的项目? (特别是因为我每次都没有相同数量的集群!)另外,我必须填写重复值(1-2 与 2-1)还是用空格替换它们?
这是否可能/可取作为打印输出?
我查看了在其他地方推荐的 PrettyTable 和 tabulate,但也无法让它们发挥作用。我想我可以使用 Pandas 或其他一些统计模块,但这似乎有点矫枉过正,因为我想做的就是输出这些值。
编辑:这是我最终做的,其中“dict”是我的输入字典:
entries=dict.items()
column_names=list(set([i[0][0] for i in entries]))
row_names=list(set([i[0][1] for i in entries]))
coltemplate="\t{:<25}"*len(column_names)
print "{:25}".format(" "), coltemplate.format(*column_names)
for r in row_names:
result=[]
for c in column_names:
if c == r:
result.append("***")
elif dict.get((c,r), None) == None:
result.append(dict.get((r,c), "***"))
else:
result.append(dict.get((c,r), "SERIOUS ERROR"))
result=[str(i) for i in result]
rowtemplate="\t{:25}"*len(result)
print "{:>25}".format(r), rowtemplate.format(*result)
【问题讨论】: