2016-11-22 2 views
0

J'ai extrait une liste de tous les composants connectés d'un graphe G comme la liste des sous-graphes de cette façon:NetworkX extraction liste des composants connectés sous-graphes de certaines dimensions: compte incorrectes

sg = list(nx.connected_component_subgraphs(G)) 

Alors je fait quelques chefs d'accusation:

n_conn_comp = nx.number_connected_components(G) # >>> 172305 
n_isolated_nodes = len(nx.isolates(G)) # >>> 152403 
n_subgraf_dimensionMoreThan1 = n_conn-comp - n_isolated_nodes # >>> 19902 
len(sg) # >>> 172305 

Jusqu'à ici tout va bien. Ensuite, ma tâche est d'extraire une liste de composants connectés avec une dimension supérieure à 1 (au moins 2) comme une liste de sous-graphe. Parce qu'il n'y a pas une telle commande de bibliothèque NetworkX (ou je me trompe ?!), je l'ai essayé de faire de cette façon:

for elem in sg: 
    if len(elem) == 1: 
     sg.remove(elem) 

Ce code ne donne aucune erreur. Je pensais que maintenant len ​​(sg) était = n_subgraf_dimensionMoreThan1, et donc = 19902. Je vérifié ceci:

len(sg) 

Mais le résultat est:

>>> 91620 

beaucoup plus que prévu (19902) I ne peut vraiment pas savoir ce qui s'est mal passé. J'ai également essayé le même code pour enlever des chaînes de len 1 dans une liste de chaînes de len différente, et cela fonctionne bien et correctement.

mai avec la liste des choses vont sous-graphes de manière différente ..

Toute suggestion ?! Merci beaucoup

+0

Possible dupliquer de [Supprimer les éléments d'une liste pendant l'itération] (http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-itating) – Joel

+0

Vous avez raison, en fait, je finalement trouvé la solution en lisant le message que vous avez lié. Puis-je supprimer ma question ..?! –

Répondre

1

Je crois que c'est parce que vous supprimez des éléments de la même liste que vous parcourez. Par exemple:

>>> sg = range(20) 
>>> for i in sg: 
     sg.remove(i) 
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 

La solution consiste à faire une copie du sg à itérer et une autre copie pour appeler votre .remove() sur.

0

J'ai finalement résolu de cette façon: (compréhension liste)

sg_MoreThan1 = [el for el in sg_notdeg if len(el)!=1] 

En fait:

len(sg_MoreThan1) 
>>> 19902 

Merci quand même.