@@ -3515,7 +3515,7 @@ def allow_multiple_edges(self, new, check=True, keep_label='any'):
3515
3515
3516
3516
self._backend.multiple_edges(new)
3517
3517
3518
- def multiple_edges(self, to_undirected=False, labels=True, sort=False):
3518
+ def multiple_edges(self, to_undirected=False, labels=True, sort=False, key=None ):
3519
3519
"""
3520
3520
Return any multiple edges in the (di)graph.
3521
3521
@@ -3525,7 +3525,11 @@ def multiple_edges(self, to_undirected=False, labels=True, sort=False):
3525
3525
3526
3526
- ``labels`` -- boolean (default: ``True``); whether to include labels
3527
3527
3528
- - ``sort`` - boolean (default: ``False``); whether to sort the result
3528
+ - ``sort`` -- boolean (default: ``False``); whether to sort the result
3529
+
3530
+ - ``key`` -- a function (default: ``None``); a function that takes an
3531
+ edge as its one argument and returns a value that can be used for
3532
+ comparisons in the sorting algorithm (we must have ``sort=True``)
3529
3533
3530
3534
EXAMPLES::
3531
3535
@@ -3574,7 +3578,36 @@ def multiple_edges(self, to_undirected=False, labels=True, sort=False):
3574
3578
[]
3575
3579
sage: G.multiple_edges(to_undirected=True, sort=True)
3576
3580
[(1, 2, 'h'), (2, 1, 'g')]
3581
+
3582
+ Using the ``key`` argument to order multiple edges of incomparable
3583
+ types::
3584
+
3585
+ sage: G = Graph([('A', 'B', 3), (1, 2, 1), ('A', 'B', 4), (1, 2, 2)], multiedges=True)
3586
+ sage: G.multiple_edges(sort=True)
3587
+ Traceback (most recent call last):
3588
+ ...
3589
+ TypeError: unsupported operand parent(s) for <: 'Integer Ring' and '<class 'str'>'
3590
+ sage: G.multiple_edges(labels=False, sort=True, key=str)
3591
+ [('A', 'B'), ('A', 'B'), (1, 2), (1, 2)]
3592
+ sage: G.multiple_edges(sort=True, key=str)
3593
+ [('A', 'B', 3), ('A', 'B', 4), (1, 2, 1), (1, 2, 2)]
3594
+ sage: G.multiple_edges(labels=True, sort=True, key=lambda e:e[2])
3595
+ [(1, 2, 1), (1, 2, 2), ('A', 'B', 3), ('A', 'B', 4)]
3596
+ sage: G.multiple_edges(labels=False, sort=True, key=lambda e:e[2])
3597
+ Traceback (most recent call last):
3598
+ ...
3599
+ IndexError: tuple index out of range
3600
+
3601
+ TESTS::
3602
+
3603
+ sage: Graph().multiple_edges(sort=False, key=str)
3604
+ Traceback (most recent call last):
3605
+ ...
3606
+ ValueError: sort keyword is False, yet a key function is given
3577
3607
"""
3608
+ if (not sort) and key:
3609
+ raise ValueError('sort keyword is False, yet a key function is given')
3610
+
3578
3611
multi_edges = []
3579
3612
seen = set()
3580
3613
@@ -3647,7 +3680,7 @@ def multiple_edges(self, to_undirected=False, labels=True, sort=False):
3647
3680
multi_edges.extend((u, v) for _ in L)
3648
3681
3649
3682
if sort:
3650
- multi_edges.sort( )
3683
+ return sorted(multi_edges, key=key )
3651
3684
return multi_edges
3652
3685
3653
3686
def name(self, new=None):
0 commit comments