summaryrefslogtreecommitdiff
path: root/release/migration_guide_from_1.x_to_2.0.html
blob: 82ed0f6b0c648f2ab326311fba64aad77d5956ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870

<!DOCTYPE html>

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />

    <title>Migration guide from 1.X to 2.0 &#8212; NetworkX 3.0rc2.dev0 documentation</title>
  
  
  
  <script data-cfasync="false">
    document.documentElement.dataset.mode = localStorage.getItem("mode") || "light";
    document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
  </script>
  
  <!-- Loaded before other Sphinx assets -->
  <link href="../_static/styles/theme.css?digest=796348d33e8b1d947c94" rel="stylesheet">
<link href="../_static/styles/bootstrap.css?digest=796348d33e8b1d947c94" rel="stylesheet">
<link href="../_static/styles/pydata-sphinx-theme.css?digest=796348d33e8b1d947c94" rel="stylesheet">

  
  <link href="../_static/vendor/fontawesome/6.1.2/css/all.min.css?digest=796348d33e8b1d947c94" rel="stylesheet">
  <link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2">
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2">
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2">

    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
    <link rel="stylesheet" type="text/css" href="../_static/custom.css" />
    <link rel="stylesheet" type="text/css" href="../_static/sg_gallery.css" />
    <link rel="stylesheet" type="text/css" href="../_static/sg_gallery-binder.css" />
    <link rel="stylesheet" type="text/css" href="../_static/sg_gallery-dataframe.css" />
    <link rel="stylesheet" type="text/css" href="../_static/sg_gallery-rendered-html.css" />
  
  <!-- Pre-loaded scripts that we'll load fully later -->
  <link rel="preload" as="script" href="../_static/scripts/bootstrap.js?digest=796348d33e8b1d947c94">
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=796348d33e8b1d947c94">

    <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
    <script src="../_static/jquery.js"></script>
    <script src="../_static/underscore.js"></script>
    <script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
    <script src="../_static/doctools.js"></script>
    <script src="../_static/sphinx_highlight.js"></script>
    <script src="../_static/copybutton.js"></script>
    <script>DOCUMENTATION_OPTIONS.pagename = 'release/migration_guide_from_1.x_to_2.0';</script>
    <link rel="canonical" href="https://networkx.org/documentation/stable/release/migration_guide_from_1.x_to_2.0.html" />
    <link rel="search" type="application/opensearchdescription+xml"
          title="Search within NetworkX 3.0rc2.dev0 documentation"
          href="../_static/opensearch.xml"/>
    <link rel="index" title="Index" href="../genindex.html" />
    <link rel="search" title="Search" href="../search.html" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <meta name="docsearch:language" content="en">
  </head>
  
  
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="180" data-default-mode="light">

  
  
  <a class="skip-link" href="#main-content">Skip to main content</a> 
<div class="container-fluid version-alert devbar">
  <div class="row no-gutters">
    <div class="col-12 text-center">
      This page is documentation for a DEVELOPMENT / PRE-RELEASE version.
      <a
        class="btn version-stable font-weight-bold ml-3 my-3 align-baseline"
        href="https://networkx.org/documentation/stable/"
        >Switch to stable version</a
      >
    </div>
  </div>
</div>


  
  <input type="checkbox" class="sidebar-toggle" name="__primary" id="__primary">
  <label class="overlay overlay-primary" for="__primary"></label>

  
  <input type="checkbox" class="sidebar-toggle" name="__secondary" id="__secondary">
  <label class="overlay overlay-secondary" for="__secondary"></label>

  
  <div class="search-button__wrapper">
    <div class="search-button__overlay"></div>
    <div class="search-button__search-container">
      
<form class="bd-search d-flex align-items-center" action="../search.html" method="get">
  <i class="fa-solid fa-magnifying-glass"></i>
  <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">
  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form>
    </div>
  </div>

  
  <nav class="bd-header navbar navbar-expand-lg bd-navbar" id="navbar-main"><div class="bd-header__inner bd-page-width">
  <label class="sidebar-toggle primary-toggle" for="__primary">
      <span class="fa-solid fa-bars"></span>
  </label>
  <div id="navbar-start">
    
    
  


<a class="navbar-brand logo" href="../index.html">

  
  
  
  
  
  
  

  
    <img src="../_static/networkx_banner.svg" class="logo__image only-light" alt="Logo image">
    <img src="../_static/networkx_banner.svg" class="logo__image only-dark" alt="Logo image">
  
  
</a>
    
  </div>

  
  <div class="col-lg-9 navbar-header-items">
    <div id="navbar-center" class="mr-auto">
      
      <div class="navbar-center-item">
        <nav class="navbar-nav">
    <p class="sidebar-header-items__title" role="heading" aria-level="1" aria-label="Site Navigation">
        Site Navigation
    </p>
    <ul id="navbar-main-elements" class="navbar-nav">
        
                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../install.html">
                        Install
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../tutorial.html">
                        Tutorial
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../reference/index.html">
                        Reference
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../auto_examples/index.html">
                        Gallery
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../developer/index.html">
                        Developer
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="index.html">
                        Releases
                      </a>
                    </li>
                

                <li class="nav-item">
                  <a class="nav-link nav-external" href="https://networkx.org/nx-guides/">
                    Guides
                  </a>
                </li>
                
    </ul>
</nav>
      </div>
      
    </div>

    <div id="navbar-end">
      
        <div class="navbar-end-item navbar-persistent--container">
          
<button class="btn btn-sm navbar-btn search-button search-button__button" title="Search" aria-label="Search" data-toggle="tooltip">
  <i class="fa-solid fa-magnifying-glass"></i>
</button>
        </div>
      
      
      <div class="navbar-end-item">
        <button class="theme-switch-button btn btn-sm btn-outline-primary navbar-btn rounded-circle" title="light/dark" aria-label="light/dark" data-toggle="tooltip">
    <span class="theme-switch" data-mode="light"><i class="fa-solid fa-sun"></i></span>
    <span class="theme-switch" data-mode="dark"><i class="fa-solid fa-moon"></i></span>
    <span class="theme-switch" data-mode="auto"><i class="fa-solid fa-circle-half-stroke"></i></span>
</button>
      </div>
      
      <div class="navbar-end-item">
        <ul id="navbar-icon-links" class="navbar-nav" aria-label="Icon Links">
        <li class="nav-item">
          
          
          
          
          
          
          
          <a href="https://networkx.org" title="Home Page" class="nav-link" rel="noopener" target="_blank" data-toggle="tooltip"><span><i class="fas fa-home"></i></span>
            <label class="sr-only">Home Page</label></a>
        </li>
        <li class="nav-item">
          
          
          
          
          
          
          
          <a href="https://github.com/networkx/networkx" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-toggle="tooltip"><span><i class="fab fa-github-square"></i></span>
            <label class="sr-only">GitHub</label></a>
        </li>
      </ul>
      </div>
      
      <div class="navbar-end-item">
        <ul class="navbar-nav">
  <li class="mr-2 dropdown">
    <button
      type="button"
      class="btn btn-version btn-sm navbar-btn dropdown-toggle"
      id="dLabelMore"
      data-toggle="dropdown"
    >
      v3.0rc2.dev0
      <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" aria-labelledby="dLabelMore">
      <li>
        <a href="https://networkx.org/documentation/latest/index.html"
          >devel (latest)</a
        >
      </li>
      <li>
        <a href="https://networkx.org/documentation/stable/index.html"
          >current (stable)</a
        >
      </li>
    </ul>
  </li>
</ul>
      </div>
      
    </div>
  </div>


  
  
    <div class="navbar-persistent--mobile">
<button class="btn btn-sm navbar-btn search-button search-button__button" title="Search" aria-label="Search" data-toggle="tooltip">
  <i class="fa-solid fa-magnifying-glass"></i>
</button>
    </div>
  

  
  <label class="sidebar-toggle secondary-toggle" for="__secondary">
      <span class="fa-solid fa-outdent"></span>
  </label>
  

</div>
  </nav>
  

  <div class="bd-container">
    <div class="bd-container__inner bd-page-width">
      
      <div class="bd-sidebar-primary bd-sidebar">
        
  
  <div class="sidebar-header-items sidebar-primary__section">
    
    
      <div class="sidebar-header-items__center">
      
      <div class="navbar-center-item">
        <nav class="navbar-nav">
    <p class="sidebar-header-items__title" role="heading" aria-level="1" aria-label="Site Navigation">
        Site Navigation
    </p>
    <ul id="navbar-main-elements" class="navbar-nav">
        
                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../install.html">
                        Install
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../tutorial.html">
                        Tutorial
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../reference/index.html">
                        Reference
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../auto_examples/index.html">
                        Gallery
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="../developer/index.html">
                        Developer
                      </a>
                    </li>
                

                    <li class="nav-item">
                      <a class="nav-link nav-internal" href="index.html">
                        Releases
                      </a>
                    </li>
                

                <li class="nav-item">
                  <a class="nav-link nav-external" href="https://networkx.org/nx-guides/">
                    Guides
                  </a>
                </li>
                
    </ul>
</nav>
      </div>
      
      </div>
    

    
    
    <div class="sidebar-header-items__end">
      
      <div class="navbar-end-item">
        <button class="theme-switch-button btn btn-sm btn-outline-primary navbar-btn rounded-circle" title="light/dark" aria-label="light/dark" data-toggle="tooltip">
    <span class="theme-switch" data-mode="light"><i class="fa-solid fa-sun"></i></span>
    <span class="theme-switch" data-mode="dark"><i class="fa-solid fa-moon"></i></span>
    <span class="theme-switch" data-mode="auto"><i class="fa-solid fa-circle-half-stroke"></i></span>
</button>
      </div>
      
      <div class="navbar-end-item">
        <ul id="navbar-icon-links" class="navbar-nav" aria-label="Icon Links">
        <li class="nav-item">
          
          
          
          
          
          
          
          <a href="https://networkx.org" title="Home Page" class="nav-link" rel="noopener" target="_blank" data-toggle="tooltip"><span><i class="fas fa-home"></i></span>
            <label class="sr-only">Home Page</label></a>
        </li>
        <li class="nav-item">
          
          
          
          
          
          
          
          <a href="https://github.com/networkx/networkx" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-toggle="tooltip"><span><i class="fab fa-github-square"></i></span>
            <label class="sr-only">GitHub</label></a>
        </li>
      </ul>
      </div>
      
      <div class="navbar-end-item">
        <ul class="navbar-nav">
  <li class="mr-2 dropdown">
    <button
      type="button"
      class="btn btn-version btn-sm navbar-btn dropdown-toggle"
      id="dLabelMore"
      data-toggle="dropdown"
    >
      v3.0rc2.dev0
      <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" aria-labelledby="dLabelMore">
      <li>
        <a href="https://networkx.org/documentation/latest/index.html"
          >devel (latest)</a
        >
      </li>
      <li>
        <a href="https://networkx.org/documentation/stable/index.html"
          >current (stable)</a
        >
      </li>
    </ul>
  </li>
</ul>
      </div>
      
    </div>
    
  </div>

  
  <div class="sidebar-start-items sidebar-primary__section">
    <div class="sidebar-start-items__item">
    </div>
  </div>
  

  
  <div class="sidebar-end-items sidebar-primary__section">
    <div class="sidebar-end-items__item">
    </div>
  </div>

  
  <div id="rtd-footer-container"></div>

      </div>
      <main id="main-content" class="bd-main">
        
        
        <div class="bd-content">
          <div class="bd-article-container">
            
            <div class="bd-header-article">
                
            </div>
            
            
            <article class="bd-article" role="main">
              
  <section id="migration-guide-from-1-x-to-2-0">
<h1>Migration guide from 1.X to 2.0<a class="headerlink" href="#migration-guide-from-1-x-to-2-0" title="Permalink to this heading">#</a></h1>
<p>This is a guide for people moving from NetworkX 1.X to NetworkX 2.0</p>
<p>Any issues with these can be discussed on the <a class="reference external" href="https://groups.google.com/forum/#!forum/networkx-discuss">mailing list</a>.</p>
<p>At the bottom of this document we discuss how to create code that will
work with both NetworkX v1.x and v2.0.</p>
<p>We have made some major changes to the methods in the Multi/Di/Graph classes.
The methods changed are explained with examples below.</p>
<p>With the release of NetworkX 2.0 we are moving to a view/iterator reporting API.
We have changed many methods from reporting lists or dicts to iterating over
the information. Most of the changes in this regard are in the base classes.
Methods that used to return containers now return views (inspired from
<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict-views">dictionary views</a>
in Python) and methods that returned an iterator have been removed.
The methods which create new graphs have changed in the depth of data copying.
<code class="docutils literal notranslate"><span class="pre">G.subgraph</span></code>/<code class="docutils literal notranslate"><span class="pre">edge_subgraph</span></code>/<code class="docutils literal notranslate"><span class="pre">reverse</span></code>/<code class="docutils literal notranslate"><span class="pre">to_directed</span></code>/<code class="docutils literal notranslate"><span class="pre">to_undirected</span></code>
are affected.  Many now have options for view creation instead of copying data.
The depth of the data copying may have also changed.</p>
<p>One View example is <code class="docutils literal notranslate"><span class="pre">G.nodes</span></code> (or <code class="docutils literal notranslate"><span class="pre">G.nodes()</span></code>) which now returns a
dict-like NodeView while <code class="docutils literal notranslate"><span class="pre">G.nodes_iter()</span></code> has been removed. Similarly
for views with <code class="docutils literal notranslate"><span class="pre">G.edges</span></code> and removing <code class="docutils literal notranslate"><span class="pre">G.edges_iter</span></code>.
The Graph attributes <code class="docutils literal notranslate"><span class="pre">G.node</span></code> and <code class="docutils literal notranslate"><span class="pre">G.edge</span></code> have been removed in favor of
using <code class="docutils literal notranslate"><span class="pre">G.nodes[n]</span></code> and <code class="docutils literal notranslate"><span class="pre">G.edges[u,</span> <span class="pre">v]</span></code>.
Finally, the <code class="docutils literal notranslate"><span class="pre">selfloop</span></code> methods and <code class="docutils literal notranslate"><span class="pre">add_path</span></code>/<code class="docutils literal notranslate"><span class="pre">star</span></code>/<code class="docutils literal notranslate"><span class="pre">cycle</span></code> have
been moved from graph methods to networkx functions.</p>
<p>We expect that these changes will break some code. We have tried to make
them break the code in ways that raise exceptions, so it will be obvious
that code is broken.</p>
<p>There are also a number of improvements to the codebase outside of the base
graph classes. These are too numerous to catalog here, but a couple obvious
ones include:</p>
<ul class="simple">
<li><p>centering of nodes in <code class="docutils literal notranslate"><span class="pre">drawing/nx_pylab</span></code>,</p></li>
<li><p>iterator vs dict output from a few <code class="docutils literal notranslate"><span class="pre">shortest_path</span></code> routines</p></li>
</ul>
<hr class="docutils" />
<p>Some demonstrations:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">networkx</span> <span class="k">as</span> <span class="nn">nx</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">complete_graph</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">nodes</span>  <span class="c1"># for backward compatibility G.nodes() works as well</span>
<span class="go">NodeView((0, 1, 2, 3, 4))</span>
</pre></div>
</div>
<p>You can iterate through <code class="docutils literal notranslate"><span class="pre">G.nodes</span></code> (or <code class="docutils literal notranslate"><span class="pre">G.nodes()</span></code>)</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">G</span><span class="o">.</span><span class="n">nodes</span><span class="p">:</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
<span class="go">0</span>
<span class="go">1</span>
<span class="go">2</span>
<span class="go">3</span>
<span class="go">4</span>
</pre></div>
</div>
<p>If you want a list of nodes you can use the Python list function</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">G</span><span class="o">.</span><span class="n">nodes</span><span class="p">)</span>
<span class="go">[0, 1, 2, 3, 4]</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">G.nodes</span></code> is set-like allowing set operations. It is also dict-like in that you
can look up node data with <code class="docutils literal notranslate"><span class="pre">G.nodes[n]['weight']</span></code>. You can still use the calling
interface <code class="docutils literal notranslate"><span class="pre">G.nodes(data='weight')</span></code> to iterate over node/data pairs. In addition
to the dict-like views <code class="docutils literal notranslate"><span class="pre">keys</span></code>/<code class="docutils literal notranslate"><span class="pre">values</span></code>/<code class="docutils literal notranslate"><span class="pre">items</span></code>, <code class="docutils literal notranslate"><span class="pre">G.nodes</span></code> has a data-view
G.nodes.data(‘weight’).  The new EdgeView <code class="docutils literal notranslate"><span class="pre">G.edges</span></code> has similar features for edges.</p>
<p>By adding views NetworkX supports some new features like set operations on
views.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">H</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">Graph</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">H</span><span class="o">.</span><span class="n">add_nodes_from</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;networkx&#39;</span><span class="p">,</span> <span class="s1">&#39;2.0&#39;</span><span class="p">])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">nodes</span> <span class="o">&amp;</span> <span class="n">H</span><span class="o">.</span><span class="n">nodes</span>  <span class="c1"># finding common nodes in 2 graphs</span>
<span class="go">{1}</span>
<span class="gp">&gt;&gt;&gt; </span><span class="c1"># union of nodes in 2 graphs</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">nodes</span> <span class="o">|</span> <span class="n">H</span><span class="o">.</span><span class="n">nodes</span>  
<span class="go">{0, 1, 2, 3, 4, &#39;networkx&#39;, &#39;2.0&#39;}</span>
</pre></div>
</div>
<p>Similarly, <code class="docutils literal notranslate"><span class="pre">G.edges</span></code> now returns an EdgeView instead of a list of edges and it
also supports set operations.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">edges</span>  <span class="c1"># for backward compatibility G.nodes() works as well</span>
<span class="go">EdgeView([(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">G</span><span class="o">.</span><span class="n">edges</span><span class="p">)</span>
<span class="go">[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">G.degree</span></code> now returns a DegreeView. This is less dict-like than the other views
in the sense that it iterates over (node, degree) pairs, does not provide
keys/values/items/get methods. It does provide lookup <code class="docutils literal notranslate"><span class="pre">G.degree[n]</span></code> and
<code class="docutils literal notranslate"><span class="pre">(node,</span> <span class="pre">degree)</span></code> iteration. A dict keyed by nodes to degree values can be
easily created if needed as <code class="docutils literal notranslate"><span class="pre">dict(G.degree)</span></code>.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">degree</span>  <span class="c1"># for backward compatibility G.degree() works as well</span>
<span class="go">DegreeView({0: 4, 1: 4, 2: 4, 3: 4, 4: 4})</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">degree</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
<span class="go">DegreeView({1: 4, 2: 4, 3: 4})</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">G</span><span class="o">.</span><span class="n">degree</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]))</span>
<span class="go">[(1, 4), (2, 4), (3, 4)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dict</span><span class="p">(</span><span class="n">G</span><span class="o">.</span><span class="n">degree</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]))</span>
<span class="go">{1: 4, 2: 4, 3: 4}</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">degree</span>
<span class="go">DegreeView({0: 4, 1: 4, 2: 4, 3: 4, 4: 4})</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">G</span><span class="o">.</span><span class="n">degree</span><span class="p">)</span>
<span class="go">[(0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dict</span><span class="p">(</span><span class="n">G</span><span class="o">.</span><span class="n">degree</span><span class="p">)</span>
<span class="go">{0: 4, 1: 4, 2: 4, 3: 4, 4: 4}</span>
</pre></div>
</div>
<p>The degree of an individual node can be calculated by <code class="docutils literal notranslate"><span class="pre">G.degree[node]</span></code>.
Similar changes have been made to <code class="docutils literal notranslate"><span class="pre">in_degree</span></code> and <code class="docutils literal notranslate"><span class="pre">out_degree</span></code>
for directed graphs. If you want just the degree values, here are some options.
They are shown for <code class="docutils literal notranslate"><span class="pre">in_degree</span></code> of a <code class="docutils literal notranslate"><span class="pre">DiGraph</span></code>, but similar ideas work
for <code class="docutils literal notranslate"><span class="pre">out_degree</span></code> and <code class="docutils literal notranslate"><span class="pre">degree</span></code></p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">DG</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">DiGraph</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">DG</span><span class="o">.</span><span class="n">add_weighted_edges_from</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.75</span><span class="p">)])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">deg</span> <span class="o">=</span> <span class="n">DG</span><span class="o">.</span><span class="n">in_degree</span>   <span class="c1"># sets up the view</span>
<span class="gp">&gt;&gt;&gt; </span><span class="p">[</span><span class="n">d</span> <span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">deg</span><span class="p">]</span>   <span class="c1"># gets all nodes&#39; degree values</span>
<span class="go">[1, 1, 0]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="p">(</span><span class="n">d</span> <span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">deg</span><span class="p">)</span>    <span class="c1"># iterator over degree values</span>
<span class="go">&lt;generator object &lt;genexpr&gt; ...&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="p">[</span><span class="n">deg</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">]]</span>   <span class="c1"># using lookup for only some nodes</span>
<span class="go">[1, 0]</span>
</pre></div>
</div>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">in_deg</span> <span class="ow">in</span> <span class="nb">dict</span><span class="p">(</span><span class="n">DG</span><span class="o">.</span><span class="n">in_degree</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>  <span class="c1"># works for nx1 and nx2</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">in_deg</span><span class="p">)</span>
<span class="go">1 1</span>
<span class="go">2 1</span>
<span class="go">3 0</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dict</span><span class="p">(</span><span class="n">DG</span><span class="o">.</span><span class="n">in_degree</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">]))</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>    <span class="c1"># works for nx1 and nx2</span>
<span class="go">dict_values([1, 0])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="c1"># DG.in_degree(nlist) creates a restricted view for only nodes in nlist.</span>
<span class="gp">&gt;&gt;&gt; </span><span class="c1"># but see the fourth option above for using lookup instead.</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">d</span> <span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">DG</span><span class="o">.</span><span class="n">in_degree</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">]))</span>
<span class="go">[1, 0]</span>
</pre></div>
</div>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">nbrs</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">nbrs</span> <span class="ow">in</span> <span class="n">DG</span><span class="o">.</span><span class="n">pred</span><span class="o">.</span><span class="n">items</span><span class="p">()]</span>  <span class="c1"># probably slightly fastest for all nodes</span>
<span class="go">[1, 1, 0]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">DG</span><span class="o">.</span><span class="n">pred</span><span class="p">[</span><span class="n">n</span><span class="p">])</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">]]</span>           <span class="c1"># probably slightly faster for only some nodes</span>
<span class="go">[1, 0]</span>
</pre></div>
</div>
<hr class="docutils" />
<p>If <code class="docutils literal notranslate"><span class="pre">n</span></code> is a node in <code class="docutils literal notranslate"><span class="pre">G</span></code>, then <code class="docutils literal notranslate"><span class="pre">G.neighbors(n)</span></code> returns an iterator.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">n</span> <span class="o">=</span> <span class="mi">1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">neighbors</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="go">&lt;dict_keyiterator object at ...&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">G</span><span class="o">.</span><span class="n">neighbors</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
<span class="go">[0, 2, 3, 4]</span>
</pre></div>
</div>
<p>DiGraphViews behave similar to GraphViews, but have a few more methods.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">D</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">DiGraph</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">add_edges_from</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">)])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">nodes</span>
<span class="go">NodeView((1, 2, 3, 4))</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">D</span><span class="o">.</span><span class="n">nodes</span><span class="p">)</span>
<span class="go">[1, 2, 3, 4]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">edges</span>
<span class="go">OutEdgeView([(1, 2), (1, 3), (2, 3), (2, 4)])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">D</span><span class="o">.</span><span class="n">edges</span><span class="p">)</span>
<span class="go">[(1, 2), (1, 3), (2, 3), (2, 4)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">in_degree</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="go">1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">out_degree</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="go">2</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">in_edges</span>
<span class="go">InEdgeView([(1, 2), (2, 3), (1, 3), (2, 4)])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">D</span><span class="o">.</span><span class="n">in_edges</span><span class="p">())</span>
<span class="go">[(1, 2), (2, 3), (1, 3), (2, 4)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">out_edges</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="go">OutEdgeDataView([(2, 3), (2, 4)])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">D</span><span class="o">.</span><span class="n">out_edges</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
<span class="go">[(2, 3), (2, 4)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">in_degree</span>
<span class="go">InDegreeView({1: 0, 2: 1, 3: 2, 4: 1})</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">D</span><span class="o">.</span><span class="n">in_degree</span><span class="p">)</span>
<span class="go">[(1, 0), (2, 1), (3, 2), (4, 1)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">successors</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="go">&lt;dict_keyiterator object at ...&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">D</span><span class="o">.</span><span class="n">successors</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
<span class="go">[3, 4]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">predecessors</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="go">&lt;dict_keyiterator object at ...&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">D</span><span class="o">.</span><span class="n">predecessors</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
<span class="go">[1]</span>
</pre></div>
</div>
<p>The same changes apply to MultiGraphs and MultiDiGraphs.</p>
<hr class="docutils" />
<p>The order of arguments to <code class="docutils literal notranslate"><span class="pre">set_edge_attributes</span></code> and <code class="docutils literal notranslate"><span class="pre">set_node_attributes</span></code> has
changed.  The position of <code class="docutils literal notranslate"><span class="pre">name</span></code> and <code class="docutils literal notranslate"><span class="pre">values</span></code> has been swapped, and <code class="docutils literal notranslate"><span class="pre">name</span></code> now
defaults to <code class="docutils literal notranslate"><span class="pre">None</span></code>.  The previous call signature of <code class="docutils literal notranslate"><span class="pre">(graph,</span> <span class="pre">name,</span> <span class="pre">value)</span></code> has
been changed to <code class="docutils literal notranslate"><span class="pre">(graph,</span> <span class="pre">value,</span> <span class="pre">name=None)</span></code>. The new style allows for <code class="docutils literal notranslate"><span class="pre">name</span></code> to
be omitted in favor of passing a dictionary of dictionaries to <code class="docutils literal notranslate"><span class="pre">values</span></code>.</p>
<p>A simple method for migrating existing code to the new version is to explicitly
specify the keyword argument names. This method is backwards compatible and
ensures the correct arguments are passed, regardless of the order. For example the old code</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">G</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">Graph</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">)])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">nx</span><span class="o">.</span><span class="n">set_node_attributes</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="s1">&#39;label&#39;</span><span class="p">,</span> <span class="p">{</span><span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;one&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;two&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">:</span> <span class="s1">&#39;three&#39;</span><span class="p">})</span>  
<span class="gp">&gt;&gt;&gt; </span><span class="n">nx</span><span class="o">.</span><span class="n">set_edge_attributes</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="s1">&#39;label&#39;</span><span class="p">,</span> <span class="p">{(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="s1">&#39;path1&#39;</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="s1">&#39;path2&#39;</span><span class="p">})</span>  
</pre></div>
</div>
<p>Will cause <code class="docutils literal notranslate"><span class="pre">TypeError:</span> <span class="pre">unhashable</span> <span class="pre">type:</span> <span class="pre">'dict'</span></code> in the new version. The code
can be refactored as</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">G</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">Graph</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">)])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">nx</span><span class="o">.</span><span class="n">set_node_attributes</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;label&#39;</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="p">{</span><span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;one&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;two&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">:</span> <span class="s1">&#39;three&#39;</span><span class="p">})</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">nx</span><span class="o">.</span><span class="n">set_edge_attributes</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;label&#39;</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="p">{(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="s1">&#39;path1&#39;</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="s1">&#39;path2&#39;</span><span class="p">})</span>
</pre></div>
</div>
<hr class="docutils" />
<p>Some methods have been moved from the base graph class into the main namespace.
These are:  <code class="docutils literal notranslate"><span class="pre">G.add_path</span></code>, <code class="docutils literal notranslate"><span class="pre">G.add_star</span></code>, <code class="docutils literal notranslate"><span class="pre">G.add_cycle</span></code>, <code class="docutils literal notranslate"><span class="pre">G.number_of_selfloops</span></code>,
<code class="docutils literal notranslate"><span class="pre">G.nodes_with_selfloops</span></code>, and <code class="docutils literal notranslate"><span class="pre">G.selfloop_edges</span></code>.
They are replaced by <code class="docutils literal notranslate"><span class="pre">nx.path_graph(G,</span> <span class="pre">...)</span></code> <code class="docutils literal notranslate"><span class="pre">nx.add_star(G,</span> <span class="pre">...)</span></code>,
<code class="docutils literal notranslate"><span class="pre">nx.selfloop_edges(G)</span></code>, etc.
For backward compatibility, we are leaving them as deprecated methods.</p>
<hr class="docutils" />
<p>With the new GraphViews (SubGraph, ReversedGraph, etc) you can’t assume that
<code class="docutils literal notranslate"><span class="pre">G.__class__()</span></code> will create a new instance of the same graph type as <code class="docutils literal notranslate"><span class="pre">G</span></code>.
In fact, the call signature for <code class="docutils literal notranslate"><span class="pre">__class__</span></code> differs depending on whether <code class="docutils literal notranslate"><span class="pre">G</span></code>
is a view or a base class. For v2.x you should use <code class="docutils literal notranslate"><span class="pre">G.fresh_copy()</span></code> to
create a null graph of the correct type—ready to fill with nodes and edges.</p>
<p>Graph views can also be views-of-views-of-views-of-graphs. If you want to find the
original graph at the end of this chain use <code class="docutils literal notranslate"><span class="pre">G.root_graph</span></code>. Be careful though
because it may be a different graph type (directed/undirected) than the view.</p>
<hr class="docutils" />
<p><code class="docutils literal notranslate"><span class="pre">topological_sort</span></code>  no longer accepts <code class="docutils literal notranslate"><span class="pre">reverse</span></code> or <code class="docutils literal notranslate"><span class="pre">nbunch</span></code> arguments.
If <code class="docutils literal notranslate"><span class="pre">nbunch</span></code> was a single node source, then the same effect can now be achieved
using the <code class="docutils literal notranslate"><span class="pre">subgraph</span></code> operator:</p>
<blockquote>
<div><p>nx.topological_sort(G.subgraph(nx.descendants(G, nbunch)))</p>
</div></blockquote>
<p>To achieve a reverse topological sort, the output should be converted to a list:</p>
<blockquote>
<div><p>reversed(list(nx.topological_sort(G)))</p>
</div></blockquote>
<hr class="docutils" />
<section id="writing-code-that-works-for-both-versions">
<h2>Writing code that works for both versions<a class="headerlink" href="#writing-code-that-works-for-both-versions" title="Permalink to this heading">#</a></h2>
<p>Methods <code class="docutils literal notranslate"><span class="pre">set_node_attributes</span></code>/<code class="docutils literal notranslate"><span class="pre">get_node_attributes</span></code>/<code class="docutils literal notranslate"><span class="pre">set_edge_attributes</span></code>/<code class="docutils literal notranslate"><span class="pre">get_edge_attributes</span></code>
have changed the order of their keyword arguments <code class="docutils literal notranslate"><span class="pre">name</span></code> and <code class="docutils literal notranslate"><span class="pre">values</span></code>. So, to make it
work with both versions you should use the keywords in your call.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">nx</span><span class="o">.</span><span class="n">set_node_attributes</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;weight&#39;</span><span class="p">)</span>
</pre></div>
</div>
<hr class="docutils" />
<p>Change any method with <code class="docutils literal notranslate"><span class="pre">_iter</span></code> in its name to the version without <code class="docutils literal notranslate"><span class="pre">_iter</span></code>.
In v1 this replaces an iterator by a list, but the code will still work.
In v2 this creates a view (which acts like an iterator).</p>
<hr class="docutils" />
<p>Replace any use of <code class="docutils literal notranslate"><span class="pre">G.edge</span></code> with <code class="docutils literal notranslate"><span class="pre">G.adj</span></code>. The Graph attribute <code class="docutils literal notranslate"><span class="pre">edge</span></code>
has been removed. The attribute <code class="docutils literal notranslate"><span class="pre">G.adj</span></code> is <code class="docutils literal notranslate"><span class="pre">G.edge</span></code> in v1 and will work
with both versions.</p>
<hr class="docutils" />
<p>If you use <code class="docutils literal notranslate"><span class="pre">G.node.items()</span></code> or similar in v1.x, you can replace it with
<code class="docutils literal notranslate"><span class="pre">G.nodes(data=True)</span></code> which works for v2.x and v1.x.  Iterating over <code class="docutils literal notranslate"><span class="pre">G.node`</span></code>
as in <code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">n</span> <span class="pre">in</span> <span class="pre">G.node:</span></code> can be replaced with <code class="docutils literal notranslate"><span class="pre">G</span></code>, as in: <code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">n</span> <span class="pre">in</span> <span class="pre">G:</span></code>.</p>
<hr class="docutils" />
<p>The Graph attribute <code class="docutils literal notranslate"><span class="pre">node</span></code> has moved its functionality to <code class="docutils literal notranslate"><span class="pre">G.nodes</span></code>, so code
expected to work with v2.x should use <code class="docutils literal notranslate"><span class="pre">G.nodes</span></code>.
In fact most uses of <code class="docutils literal notranslate"><span class="pre">G.node</span></code> can be replaced by an idiom that works for both
versions. The functionality that can’t easily is: <code class="docutils literal notranslate"><span class="pre">G.node[n]</span></code>.
In v2.x that becomes <code class="docutils literal notranslate"><span class="pre">G.nodes[n]</span></code> which doesn’t work in v1.x.</p>
<p>Luckily you can still use <code class="docutils literal notranslate"><span class="pre">G.node[n]</span></code> in v2.x when you want it to be able to work
with v1.x too. We have left <code class="docutils literal notranslate"><span class="pre">G.node</span></code> in v2.x as a transition pointer to <code class="docutils literal notranslate"><span class="pre">G.nodes</span></code>.
We envision removing <code class="docutils literal notranslate"><span class="pre">G.node</span></code> in v3.x (sometime in the future).</p>
<hr class="docutils" />
<p>Copying node attribute dicts directly from one graph to another can corrupt
the node data structure if not done correctly. Code such as the following:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="c1"># dangerous in v1.x, not allowed in v2.x</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">node</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">H</span><span class="o">.</span><span class="n">node</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>  
</pre></div>
</div>
<p>used to work, even though it could cause errors if <code class="docutils literal notranslate"><span class="pre">n</span></code> was not a node in <code class="docutils literal notranslate"><span class="pre">G</span></code>.
That code will cause an error in v2.x.  Replace it with one of the more safe versions:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">nodes</span><span class="p">[</span><span class="n">n</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">H</span><span class="o">.</span><span class="n">nodes</span><span class="p">[</span><span class="n">n</span><span class="p">])</span>  <span class="c1"># works in v2.x</span>
</pre></div>
</div>
<hr class="docutils" />
<p>The methods removed from the graph classes and put into the main package namespace
can be used via the associated deprecated methods. If you want to update your code
to the new functions, one hack to make that work with both versions is to write
your code for v2.x and add code to the v1 namespace in an ad hoc manner:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">if</span> <span class="n">nx</span><span class="o">.</span><span class="n">__version__</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;1&#39;</span><span class="p">:</span>
<span class="gp">... </span>    <span class="n">nx</span><span class="o">.</span><span class="n">add_path</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">G</span><span class="p">,</span> <span class="n">nodes</span><span class="p">:</span> <span class="n">G</span><span class="o">.</span><span class="n">add_path</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
</pre></div>
</div>
<p>Similarly, v2.x code that uses <code class="docutils literal notranslate"><span class="pre">G.fresh_copy()</span></code> or <code class="docutils literal notranslate"><span class="pre">G.root_graph</span></code> is hard to make
work for v1.x. It may be best in this case to determine the graph type you want
explicitly and call Graph/DiGraph/MultiGraph/MultiDiGraph directly.</p>
</section>
<section id="using-pickle-with-v1-and-v2">
<h2>Using Pickle with v1 and v2<a class="headerlink" href="#using-pickle-with-v1-and-v2" title="Permalink to this heading">#</a></h2>
<p>The Pickle protocol does not store class methods, only the data. So if you write a
pickle file with v1 you should not expect to read it into a v2 Graph. If this happens
to you, read it in with v1 installed and write a file with the node and edge
information. You can read that into a config with v2 installed and then add those nodes
and edges to a fresh graph. Try something similar to this:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="c1"># in v1.x</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">([</span><span class="n">G</span><span class="o">.</span><span class="n">nodes</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span> <span class="n">G</span><span class="o">.</span><span class="n">edges</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="kc">True</span><span class="p">)],</span> <span class="n">file</span><span class="p">)</span>  
<span class="gp">&gt;&gt;&gt; </span><span class="c1"># then in v2.x</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">nodes</span><span class="p">,</span> <span class="n">edges</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>  
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">Graph</span><span class="p">()</span>  
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">add_nodes_from</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>  
<span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">add_edges_from</span><span class="p">(</span><span class="n">edges</span><span class="p">)</span>  
</pre></div>
</div>
</section>
</section>


            </article>
            
            
            
          </div>
          
          
          
            <div class="bd-sidebar-secondary bd-toc">
              
<div class="toc-item">
  
<div class="tocsection onthispage">
    <i class="fa-solid fa-list"></i> On this page
</div>
<nav id="bd-toc-nav" class="page-toc">
    <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#writing-code-that-works-for-both-versions">
   Writing code that works for both versions
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#using-pickle-with-v1-and-v2">
   Using Pickle with v1 and v2
  </a>
 </li>
</ul>

</nav>
</div>

<div class="toc-item">
  
<div id="searchbox"></div>
</div>

<div class="toc-item">
  
</div>

<div class="toc-item">
  
</div>

            </div>
          
          
        </div>
        <footer class="bd-footer-content">
          <div class="bd-footer-content__inner">
            
          </div>
        </footer>
        
      </main>
    </div>
  </div>

  
    
  <!-- Scripts loaded after <body> so the DOM is not blocked -->
  <script src="../_static/scripts/bootstrap.js?digest=796348d33e8b1d947c94"></script>
<script src="../_static/scripts/pydata-sphinx-theme.js?digest=796348d33e8b1d947c94"></script>
 
  <footer class="bd-footer"><div class="bd-footer__inner container">
  
  <div class="footer-item">
    
<p class="copyright">

    &copy; Copyright 2004-2023, NetworkX Developers.<br>

</p>

  </div>
  
  <div class="footer-item">
    <p class="theme-version">
    Built with the
    <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">
        PyData Sphinx Theme
    </a>
    0.12.0.
</p>
  </div>
  
  <div class="footer-item">
    
<p class="sphinx-version">
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.2.3.<br>
</p>

  </div>
  
</div>
  </footer>
  </body>
</html>