矩阵/表表示的成对组合

问题描述 投票:0回答:1

[我认为这可能是人们已经解决的问题,甚至可能是我所缺少的某些功能,所以我想我会在重新发明轮子之前问一下。

基本上,考虑到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或类似名称。

python matrix combinations itertools
1个回答
0
投票

这将按照您所描述的那样创建一个矩阵,将“空白”用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]))
© www.soinside.com 2019 - 2024. All rights reserved.