[我认为这可能是人们已经解决的问题,甚至可能是我所缺少的某些功能,所以我想我会在重新发明轮子之前问一下。
基本上,考虑到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]
我不确定None
的来源,因为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
[我很清楚按输入数据的长度对chunk
进行处理的幼稚方法也不是正确的,因为属于7
+ C
比较的D
在错误的行上。我忘了解释每次都消失的其他条目。
[如果有更好的方法,我很乐意改变这种方法。我一直专注于为此使用itertools
,因为它最终可能会在大型文件上运行,并且可能在较大的脚本中进行数千次比较,并且还会发生其他计算等情况,因此,避免自我重复比较是理想的选择。
[添加,我希望以后能够将我所描述的矩阵(具有行名和列名)输出到tsv / csv或类似名称。
这将按照您所描述的那样创建一个矩阵,将“空白”用0表示:
[[(a[1]+b[1] if a[0]<b[0] else 0) for b in x] for a in x]
要打印出来:
print("\t".join(['']+[a[0] for a in x]))
for a in x:
print("\t".join([a[0]] + [(str(a[1]+b[1]) if a[0]<b[0] else '') for b in x]))