【发布时间】:2020-02-14 16:12:05
【问题描述】:
我认为这可能是人们已经解决的问题,甚至可能是我缺少的一些功能,所以我想在重新发明轮子之前先问一下。
基本上,鉴于itertools.combinations 的一些成对输出,我想将其表示为每个比较的矩阵/表格。
到目前为止,我大致做到了这一点:
from itertools import combinations
def chunks(l, n):
n = max(1, n)
return [l[i:i+n] for i in range(0, len(l), n)]
x = [("A", 1), ("B", 2), ("C", 3), ("D", 4), ("E", 5)]
[print(i) for i in chunks([i[1]+j[1] for i, j in combinations(x, 2)], len(x)-1)]
这给了我一个矩阵式的输出:
[3, 4, 5, 6]
[5, 6, 7, 7]
[8, 9]
[None, None, None]
我还不确定Nones 来自哪里,因为chunks([i[1]+j[1] for i, j in combinations(x, 2)], len(x)-1) 的输出是:
[[3, 4, 5, 6], [5, 6, 7, 7], [8, 9]]
但我可以稍后再调查(但请随时指出我明显的错误!)
理想情况下,我希望得到一个成对矩阵(理想情况下,还要附上比较的名称,所以它看起来像:
A B C D E
A 3 4 5 6
B 5 6 7
C 7 8
D 9
E
很明显,我对输入数据长度的chunking 的幼稚方法也不太正确,因为属于C+D 的7 比较在错误的行上。我忘记解释每次消失的额外条目。
如果有更好的方法,我很乐意改变方法。我一直专注于为此使用itertools,因为它最终可能会在大文件上运行,并且可能在更大的脚本中进行数千次比较,并发生其他计算等,因此避免自我和重复比较是理想的。
编辑:
补充一点,我希望随后能够将我描述的矩阵以及行名和列名输出到 tsv/csv 或类似文件。
【问题讨论】:
标签: python matrix combinations itertools