Python 3, ориентированный взвешенный график на отдельные векторы отношений

Я новичок в Python 3, и для дальнейшей обработки мне в настоящее время нужно преобразовать направленный взвешенный граф (например, A-> B вес 20, B -> A вес 10), хранящийся в виде матрицы, в отдельные операторы отношений, такие как [A, B, 20] (узел, узел, вес).

Матрица выглядит так:

matrix     A     B     C
A          0    10     0
B         20     0     5
C         10     5     0

Результат, который я хочу получить, следующий:

[A, B, 10], [B, A, 20], [B, C, 5], [C, A, 10], [C, B, 5]

Есть ли простое решение в python для этого? Может быть, с некоторыми библиотеками, чтобы помочь.

Данные находятся в .csv, и я бы прочитал их в своей программе. Все, что я могу придумать в качестве решения, — это пройтись по каждой строке и написать все эти операторы в какой-то неприятный вложенный цикл while и для беспорядка.

Спасибо, мкс


person mxzwrnz    schedule 17.03.2016    source источник


Ответы (2)


Просто создайте цикл для строк и еще один для столбцов:

 table = [[0  ,  10   ,  0],[20 ,    0  ,   5],[10  ,   5   ,  0]]

 r = []
 l = ['A','B','C']
 for i in range(len(['A','B','C'])):
     for j in range(len(['A','B','C'])):
         if i!=j:
             r.append([l[i],l[j],table[i][j]])
 print(r)

, результат такой:

 [['A', 'B', 10], ['A', 'C', 0], ['B', 'A', 20], ['B', 'C', 5], ['C', 'A', 10], ['C', 'B', 5]]
person armatita    schedule 17.03.2016

с open(filename) как f: reader = csv.DictReader(f, skipinitialspace=True) names = reader.fieldnames vecs = [] для строки в читателе: fm = row[names[0]] для to в именах[1: ]: w = int(row[to]), если w: vecs.append([fm, to, w])

печать (век)

person RootTwo    schedule 18.03.2016