def test_to_tuple(): a_list = [1, 2, [1, 3]] actual = to_tuple(a_list) expected = (1, 2, (1, 3)) assert actual == expected a_tuple = (1, 2) actual = to_tuple(a_tuple) expected = a_tuple assert actual == expected a_mix = (1, 2, [1, 3]) actual = to_tuple(a_mix) expected = (1, 2, (1, 3)) assert actual == expected
def node_link_graph(data, directed=False, multigraph=True, attrs=None): """Returns graph from node-link data format. Parameters ---------- data : dict node-link formatted graph data directed : bool If True, and direction not specified in data, return a directed graph. multigraph : bool If True, and multigraph not specified in data, return a multigraph. attrs : dict A dictionary that contains five keys 'source', 'target', 'name', 'key' and 'link'. The corresponding values provide the attribute names for storing NetworkX-internal graph data. Default value: dict(source='source', target='target', name='id', key='key', link='links') Returns ------- G : NetworkX graph A NetworkX graph object Examples -------- >>> from networkx import json_graph >>> G = nx.Graph([('A', 'B')]) >>> data = json_graph.node_link_data(G) >>> H = json_graph.node_link_graph(data) Notes ----- Attribute 'key' is only used for multigraphs. See Also -------- node_link_data, adjacency_data, tree_data """ # Allow 'attrs' to keep default values. if attrs is None: attrs = _attrs else: attrs.update({k: v for k, v in _attrs.items() if k not in attrs}) multigraph = data.get('multigraph', multigraph) directed = data.get('directed', directed) if multigraph: graph = nx.MultiGraph() else: graph = nx.Graph() if directed: graph = graph.to_directed() name = attrs['name'] source = attrs['source'] target = attrs['target'] links = attrs['link'] # Allow 'key' to be omitted from attrs if the graph is not a multigraph. key = None if not multigraph else attrs['key'] graph.graph = data.get('graph', {}) c = count() for d in data['nodes']: node = to_tuple(d.get(name, next(c))) nodedata = dict((make_str(k), v) for k, v in d.items() if k != name) graph.add_node(node, **nodedata) for d in data[links]: src = tuple(d[source]) if isinstance(d[source], list) else d[source] tgt = tuple(d[target]) if isinstance(d[target], list) else d[target] if not multigraph: edgedata = dict((make_str(k), v) for k, v in d.items() if k != source and k != target) graph.add_edge(src, tgt, **edgedata) else: ky = d.get(key, None) edgedata = dict((make_str(k), v) for k, v in d.items() if k != source and k != target and k != key) graph.add_edge(src, tgt, ky, **edgedata) return graph
def node_link_graph(data, directed=False, multigraph=True, attrs=None): """Return graph from node-link data format. Parameters ---------- data : dict node-link formatted graph data directed : bool If True, and direction not specified in data, return a directed graph. multigraph : bool If True, and multigraph not specified in data, return a multigraph. attrs : dict A dictionary that contains five keys 'source', 'target', 'name', 'key' and 'link'. The corresponding values provide the attribute names for storing NetworkX-internal graph data. Default value: dict(source='source', target='target', name='id', key='key', link='links') Returns ------- G : NetworkX graph A NetworkX graph object Examples -------- >>> from networkx.readwrite import json_graph >>> G = nx.Graph([('A', 'B')]) >>> data = json_graph.node_link_data(G) >>> H = json_graph.node_link_graph(data) Notes ----- Attribute 'key' is only used for multigraphs. See Also -------- node_link_data, adjacency_data, tree_data """ # Allow 'attrs' to keep default values. if attrs is None: attrs = _attrs else: attrs.update({k: v for k, v in _attrs.items() if k not in attrs}) multigraph = data.get('multigraph', multigraph) directed = data.get('directed', directed) if multigraph: graph = nx.MultiGraph() else: graph = nx.Graph() if directed: graph = graph.to_directed() name = attrs['name'] source = attrs['source'] target = attrs['target'] links = attrs['link'] # Allow 'key' to be omitted from attrs if the graph is not a multigraph. key = None if not multigraph else attrs['key'] graph.graph = data.get('graph', {}) c = count() for d in data['nodes']: node = to_tuple(d.get(name, next(c))) nodedata = dict((make_str(k), v) for k, v in d.items() if k != name) graph.add_node(node, **nodedata) for d in data[links]: src = tuple(d[source]) if isinstance(d[source], list) else d[source] tgt = tuple(d[target]) if isinstance(d[target], list) else d[target] if not multigraph: edgedata = dict((make_str(k), v) for k, v in d.items() if k != source and k != target) graph.add_edge(src, tgt, **edgedata) else: ky = d.get(key, None) edgedata = dict((make_str(k), v) for k, v in d.items() if k != source and k != target and k != key) graph.add_edge(src, tgt, ky, **edgedata) return graph