# MultiDiGraph.subgraph#

MultiDiGraph.subgraph(nodes)#

Returns a SubGraph view of the subgraph induced on `nodes`.

The induced subgraph of the graph contains the nodes in `nodes` and the edges between those nodes.

Parameters:
nodeslist, iterable

A container of nodes which will be iterated through once.

Returns:
GSubGraph View

A subgraph view of the graph. The graph structure cannot be changed but node/edge attributes can and are shared with the original graph.

Notes

The graph, edge and node attributes are shared with the original graph. Changes to the graph structure is ruled out by the view, but changes to attributes are reflected in the original graph.

To create a subgraph with its own copy of the edge/node attributes use: G.subgraph(nodes).copy()

For an inplace reduction of a graph to a subgraph you can remove nodes: G.remove_nodes_from([n for n in G if n not in set(nodes)])

Subgraph views are sometimes NOT what you want. In most cases where you want to do more than simply look at the induced edges, it makes more sense to just create the subgraph as its own graph with code like:

```# Create a subgraph SG based on a (possibly multigraph) G
SG = G.__class__()
SG.add_nodes_from((n, G.nodes[n]) for n in largest_wcc)
if SG.is_multigraph():
(n, nbr, key, d)
if n in largest_wcc
for nbr, keydict in nbrs.items()
if nbr in largest_wcc
for key, d in keydict.items()
)
else:
(n, nbr, d)
if n in largest_wcc
for nbr, d in nbrs.items()
if nbr in largest_wcc
)
SG.graph.update(G.graph)
```

Examples

```>>> G = nx.path_graph(4)  # or DiGraph, MultiGraph, MultiDiGraph, etc
>>> H = G.subgraph([0, 1, 2])
>>> list(H.edges)
[(0, 1), (1, 2)]
```