[PYTHON] Löschen qualifizierender Eckpunkte in networkx

Aufgabe

Löschen wir die Eckpunkte, die die Bedingungen erfüllen, aus dem im Programm definierten Diagramm!

Dieser Zustand

--Verwenden Sie networkx --Graphen werden im Programm definiert -Löschen Sie [Verse mit der Reihenfolge 0] oder [Verse mit der Reihenfolge 1 und den mit diesen Eckpunkten verbundenen Kanten].

Das erste Programm, an das ich gedacht habe

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])

#n=G.number_of_nodes()
#[Spitzen des Grades 0]Oder[Ein Scheitelpunkt vom Grad 1 und die Seite, die mit diesem Scheitelpunkt verbunden ist]Löschen
for v in G:
    #print(G.degree(v))
    #print("v=",v)
    G_deg=G.degree(v)
    if G_deg==0 or G_deg==1:
        G.remove_node(v)
        #print("G_deg=",G_deg)


#Grafikausgabe
nx.draw_networkx(G)
plt.show()

Ich fand es gut und versuchte es.

Error

Traceback (most recent call last):
  File "kadai06d.py", line 10, in <module>
    for v in G:
RuntimeError: dictionary changed size during iteration

Es ist nicht einfach. .. .. Ich habe online gesucht, um die Ursache zu finden.

Ursache 1

Zuallererst ist die Bedeutung des Fehlers ** "Das iterierende Objekt kann nicht geändert werden" **. Mit anderen Worten, bedeutet dies, dass Sie nicht löschen können, während Sie mit for v in G: eine Schleife ausführen?

Verbesserung 1

Wenn ich es nicht innerhalb von "für v in G" löschen könnte, dachte ich, ich würde die Eckpunkte auflisten, die die Bedingungen erfüllen, und sie dann alle auf einmal außerhalb von "für v in G" löschen.

Programm zur Verbesserung 1

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])

node_be=G.number_of_nodes() #Anzahl der Eckpunkte vor dem Löschen
edge_be=G.number_of_edges() #Anzahl der Seiten vor dem Löschen

#[Spitzen des Grades 0]Oder[Ein Scheitelpunkt vom Grad 1 und die Seite, die mit diesem Scheitelpunkt verbunden ist]Löschen
G_rem=[]
#Listen Sie die Eckpunkte auf, die die Bedingungen erfüllen
for v in G:
    G_deg=G.degree(v)
    #print("G_deg[",v,"]=",G_deg)
    if G_deg<=1:
       #print("v=",v)
       G_rem.append(v)

#Löschen Sie die Eckpunkte, die die Bedingungen erfüllen
G.remove_nodes_from(G_rem)

node_af=G.number_of_nodes() #Anzahl der Eckpunkte nach dem Löschen
edge_af=G.number_of_edges() #Anzahl der Seiten nach dem Löschen

#Grafikausgabe
nx.draw_networkx(G)
plt.show()

Ich habe versucht, es damit zu betreiben.

Diagramm ausgeführt

wronggraph.png \\ Es gibt noch Eckpunkte vom Grad 1 ///

Ursache 2

Wenn man einmal "für v in G:" betrachtet, scheint es, dass "v" immer größer wird, und selbst wenn die Reihenfolge 1 wird, geht es durch. Mit anderen Worten, Sie müssen immer wieder zurückblicken, nicht einmal und am Ende!

Verbesserung 2

Ich entschied mich für eine Doppelschleife, um für v in G: viele Male zu wiederholen. Versuchen Sie, für die Anzahl der Scheitelpunkte mehrmals "für" zu drehen.

Verbessertes Programm

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])

node_be=G.number_of_nodes() #Anzahl der Eckpunkte vor dem Löschen
edge_be=G.number_of_edges() #Anzahl der Seiten vor dem Löschen

#[Spitzen des Grades 0]Oder[Ein Scheitelpunkt vom Grad 1 und die Seite, die mit diesem Scheitelpunkt verbunden ist]Löschen
G_rem=[]
#Listen Sie die Eckpunkte auf, die die Bedingungen erfüllen
for i in range(node_be):
    for v in G:
        G_deg=G.degree(v)
        #print("G_deg[",v,"]=",G_deg)
        if G_deg<=1:
            #print("v=",v)
            G_rem.append(v)
    #Löschen Sie die Eckpunkte, die die Bedingungen erfüllen
    G.remove_nodes_from(G_rem)

node_af=G.number_of_nodes() #Anzahl der Eckpunkte nach dem Löschen
edge_af=G.number_of_edges() #Anzahl der Seiten nach dem Löschen

#Grafikausgabe
nx.draw_networkx(G)
plt.savefig("output.png ")
plt.show()

Diagramm ausgeführt

output.png Der Peak 1. Ordnung ist weg!

Schließlich

Ich stellte fest, dass ich einen Scheitelpunkt nicht einfach löschen konnte, ohne verschiedene Schritte durchlaufen zu haben. Danke bis zum Ende.

Recommended Posts

Löschen qualifizierender Eckpunkte in networkx
[Python] Verschieben Sie Dateien, die die Bedingungen erfüllen
[Einführung in Python] So löschen Sie Zeilen, die mehrere Bedingungen in Pandas.DataFrame erfüllen
Extrahieren Sie nur Elemente, die bestimmte Bedingungen in Python erfüllen
[Python] Ein Programm, das die Anzahl der Schokoladensegmente berechnet, die die Bedingungen erfüllen
Suchen Sie den Index der Elemente, die den Bedingungen im Pandas-Datenrahmen / der Pandas-Serie entsprechen
So ermitteln Sie den Koeffizienten der ungefähren Kurve, die in Python durch die Scheitelpunkte verläuft
Diejenige, die den Fortschrittsbalken in Python anzeigt
In Bash "Löschen Sie die Datei, falls vorhanden".
Die Geschichte, die zur Installation von Pip passt
Löschen Sie den Teilstring
Extrahieren Sie Zeilen, die die Bedingungen erfüllen, aus Excel mit Datumsdaten (% Y /% m /% d).
Linux ist in erster Linie so etwas
[Django] Tabelle abschneiden (alle Tabellendaten löschen)
Suchen Sie den Teil 575 aus Wikipedia in Python
Module, die die Shell in Python durchlaufen können
Die Geschichte, dass yapf nicht mit vscode funktioniert hat
So löschen Sie "(base)", das im Terminal angezeigt wird, wenn Anaconda auf einem Mac installiert ist