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