0

グラフ G を作成し、2 つのノードを追加します。次に、このグラフの連結成分を見つけて変数 a に代入します。

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

次に、変数 a を出力します。

>> print(list(a))

結果は次のようになります。

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

この後、同じプロンプトを使用して再度出力しましたが、何も得られませんでした:

[]

私はこれについて非常に興味があります。接続されたコンポーネントを一度出力すると、それらが消えてしまったようです?! どうして?!

4

1 に答える 1

0

nx.connected_components「ジェネレーター」と呼ばれるものを作成します。それらの詳細については、こちらを参照してください: Python でのジェネレーターの理解

大きなポイントは、ジェネレーターは、ユーザーが要求するまで何かを計算しません。一度計算すると、それが生成され、メモリから消えてしまうということです。たとえば、

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

で 1 つのコンポーネントが検出され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))

ここでジェネレーターは使い果たされていますが、生成された値は listbに格納されており、繰り返し使用できます。

于 2015-09-02T21:16:23.597 に答える