'Add all the edges in ebunch.
Parameters
ebunch : container of edges
Each edge given in the container will be added to the
graph. The edges can be:
- 2-tuples (u, v) or
- 3-tuples (u, v, d) for an edge data dict d, or
- 3-tuples (u, v, k) for not iterable key k, or
- 4-tuples (u, v, k, d) for an edge with data and key k
attr : keyword arguments, optional
Edge data (or labels or objects) can be assigned using
keyword arguments.
Returns
A list of edge keys assigned to the edges in `ebunch`.
See Also
add_edge : add a single edge
add_weighted_edges_from : convenient way to add weighted edges
Notes
Adding the same edge twice has no effect but any edge data
will be updated when each duplicate edge is added.
Edge attributes specified in an ebunch take precedence over
attributes specified via keyword arguments.
Default keys are generated using the method ``new_edge_key()``.
This method can be overridden by subclassing the base class and
providing a custom ``new_edge_key()`` method.
Examples
>>> G = nx.Graph()   # or DiGraph, MultiGraph, MultiDiGraph, etc
>>> G.add_edges_from([(0, 1), (1, 2)]) # using a list of edge tuples
>>> e = zip(range(0, 3), range(1, 4))
>>> G.add_edges_from(e) # Add the path graph 0-1-2-3
Associate data to edges
>>> G.add_edges_from([(1, 2), (2, 3)], weight=3)
>>> G.add_edges_from([(3, 4), (1, 4)], label=\'WN2898\')'

def add_edges_from(self, ebunch, **attr):

    keylist = []
    for e in ebunch:
        ne = len(e)
        if (ne == 4):
            (u, v, key, dd) = e
        elif (ne == 3):
            (u, v, dd) = e
            key = None
        elif (ne == 2):
            (u, v) = e
            dd = {}
            key = None
        else:
            msg = 'Edge    tuple    {}    must    be    a    2-tuple,    3-tuple    or    4-tuple.'
            raise NetworkXError(msg.format(e))
        ddd = {}
        ddd.update(attr)
        try:
            ddd.update(dd)
        except:
            if (ne != 3):
                raise
            key = dd
        key = self.add_edge(u, v, key)
        self[u][v][key].update(ddd)
        keylist.append(key)
    return keylist
