Подключенные компоненты в Networkx пропали после печати?

Я создал граф G и добавил два узла. Затем я нахожу компоненты связности этого графа и присваиваю их переменной a.

import networkx as nx
G = nx.Graph()
G.add_node('a')
G.add_node('b')
a = nx.connected_components(G)

Затем я печатаю переменную a out:

>> print(list(a))

и я получаю результат как:

[set(['a']), set(['b'])]

После этого я снова распечатал, используя ту же подсказку, но ничего не получил:

[]

Мне это очень любопытно. Один раз распечатываю подключенные компоненты, и кажется, что они исчезли ?! Почему?!


person Shudong    schedule 02.09.2015    source источник


Ответы (1)


nx.connected_components создает нечто, называемое «генератором». Вы можете узнать о них больше здесь: Общие сведения о генераторах в Python

Важным моментом является то, что генератор ничего не вычисляет, пока вы об этом не попросите, и как только он это вычислит, он возвращает вещь, а затем она исчезает из памяти. Так, например, если вы сделаете

for component in nx.connected_components(G):
     action(component)

Он найдет один компонент в G, а затем код перейдет к выполняемому действию. Первый найденный компонент хранится в component, и сам генератор его больше не запоминает. Когда действие завершено, начинается следующий шаг цикла, и генератор выполнит все вычисления, чтобы найти следующий компонент. Это отлично подходит для сохранения памяти и не позволяет python тратить много времени на вычисления - если вы можете выйти из цикла раньше, ему не придется вычислять более поздние компоненты.

В вашем случае вы сделали list(a). Здесь a - генератор. list нужно все, что есть в a. Все они рассчитываются и заносятся в список. Теперь в a ничего не осталось. Он «истощен». Это нормальное поведение генератора. Список пропал, потому что он не был сохранен с именем.

Для того, что, как мне кажется, вы хотите, вы должны сказать:

import networkx as nx
G = nx.Graph()
G.add_node('a')
G.add_node('b')
b = list(nx.connected_components(G))

Здесь генератор исчерпан, но созданные им значения сохраняются в списке b, который вы можете использовать повторно.

person Joel    schedule 02.09.2015