Извлечь список из all_simple_paths и их длины в python - PullRequest
0 голосов
/ 04 июля 2018

У меня есть длинный список источников и целей, которые формируют график следующим образом:

id_a = [...] #source nodes
id_b = [...] #target nodes
distance = [..] #distance between source and target nodes

G = nx.Graph()
path, length = [], []
for a, b, c in zip(id_a, id_b, distance):
    G.add_edge(a, b, weight=c)

cl - это подмножество всех узлов в графе, и я хочу извлечь пути, соединяющие все cl вместе, поэтому я использую all_simple_paths ()

path = []
for i in range(len(cl)):
    for j in range(len(cl)):
        if i != j:
            path.append(nx.all_simple_paths(G, source=cl[i], target=cl[j]))

Я хочу иметь возможность перечислить все простые пути и их длины, поэтому я пытаюсь:

for i in range(len(path)):
    total_length = 0
    for j in range(len(path[i])-1):
        source, target = path[i][j], path[i][j+1]
        edge = G[source][target]
        length = edge['weight']
        total_length += length
    length.append(total_length)

Но я продолжаю получать ошибку

object of type 'generator' has no len()

И я не могу понять, как преобразовать генератор all_simple_paths () в списки, по которым я могу перебирать и извлекать полную длину всех путей.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 05 июля 2018

Если вы прочитаете документацию all_simple_paths , вы увидите, что он возвращает генератор. Итак, просто используйте extend вместо append метода, подобного этому

path = []
for i in range(len(cl)):
    for j in range(len(cl)):
        if i != j:
            path.extend(nx.all_simple_paths(G, source=cl[i], target=cl[j]))

Подробнее о том, почему extend работает в этом случае, см. этот ответ .

Также я вижу в последней части вашего кода, вы устанавливаете length как length = edge['weight'], затем добавляете с помощью length.append(total_length). Это вернется как ошибка, так как вес ребра будет int. Используйте разные имена переменных примерно так:

path_weight = []    #<----- List to store all path's weights
for i in range(len(path)):
    total_length = 0
    for j in range(len(path[i])-1):
        source, target = path[i][j], path[i][j+1]
        edge = G[source][target]
        length = edge['weight']          #<--- Get the weight
        total_length += length
    path_weight.append(total_length)     #Append to the list
...