попарные комбинации для представления матрицы / таблицы - PullRequest
0 голосов
/ 14 февраля 2020

Я думаю, что это, вероятно, что-то, что люди уже решили, и, может быть, даже некоторые запеченные функции, которые мне не хватает, поэтому я решил спросить, прежде чем изобретать велосипед.

По сути, учитывая некоторые парный вывод из 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 s, поскольку вывод 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 для этого, так как это может привести к запуску больших файлов с потенциально тысячами сравнений в более крупном сценарии с другими вычислениями и т. Д. c, поэтому избегать самостоятельных и повторных сравнений идеально.

Редактировать:

Чтобы добавить, я хотел бы впоследствии иметь возможность выводить изображенную мной матрицу с именами строк и столбцов в tsv / csv или аналогичное.

1 Ответ

1 голос
/ 14 февраля 2020

Это создает матрицу, как вы описываете, используя 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]))
...