用python中的networkx构建大型加权网络

用python中的networkx构建大型加权网络,python,performance,dictionary,networkx,Python,Performance,Dictionary,Networkx,我有大量这种格式的词典 d1={'el1':2, 'el3':4, ...,'el12':32} d2={'el3':5, 'el4':6, ...,'el12':21} 我想使用networkx创建一个网络,其中:每个节点都是字典的一个键,该字典具有一个表示节点所有值之和的属性(例如,考虑到两个给定字典,el3的值为9),如果两个节点同时出现在同一个字典中,则两个节点之间有一条边,其权重属性等于它们同时出现的次数(例如,对于el3和el12,它将是2,因为它们同时出现在两个字典中) 我知道如

我有大量这种格式的词典

d1={'el1':2, 'el3':4, ...,'el12':32}
d2={'el3':5, 'el4':6, ...,'el12':21}
我想使用networkx创建一个网络,其中:每个节点都是字典的一个键,该字典具有一个表示节点所有值之和的属性(例如,考虑到两个给定字典,el3的值为9),如果两个节点同时出现在同一个字典中,则两个节点之间有一条边,其权重属性等于它们同时出现的次数(例如,对于el3和el12,它将是2,因为它们同时出现在两个字典中)


我知道如何创建网络,以及如何在networkx中为节点和边添加属性,但我正在寻找一种有效的方法,因为我有大约12000个这样的字典。

不确定你能比暴力快多少,但是itertools可以使用
排列/组合
使添加边更容易

d1 = {'el1': 2, 'el3': 4, 'el5': 17, 'el12':32}
d2 = {'el1': 5, 'el3': 9, 'el5': 11, 'el12':6}
d3 = {'el1': 1, 'el6': 2, 'el7': 41, 'el12':13}

d = [d1, d2, d3]

G = nx.DiGraph()
# or just Graph() if not weighted
# If unweighted, you should use combinations() instead, as for a given list
# ['e1', 'e2', 'e3'], permutations(l, 2) will give both ('e1', 'e2') and ('e2','e1')
# whereas combinations will give only one of those. 

for item in d:
    G.add_nodes_from(item)
    for entry in item:
        try: 
            G.node[entry]['weight'] += item[entry]
        except:
            G.node[entry]['weight'] = item[entry]
    for source, target in itertools.permutations(item.keys(), 2):
        G.add_edge(source, target)
        try: 
            G.edge[source][target]['weight'] += 1
        except:
            G.edge[source][target]['weight'] = 1

G.node
{'el1': {'weight': 8},
 'el12': {'weight': 51},
 'el3': {'weight': 13},
 'el5': {'weight': 28},
 'el6': {'weight': 2},
 'el7': {'weight': 41}}
G.edge
{'el1': {'el12': {'weight': 3},
  'el3': {'weight': 2},
  'el5': {'weight': 2},
  'el6': {'weight': 1},
  'el7': {'weight': 1}},
 'el12': {'el1': {'weight': 3},
  'el3': {'weight': 2},
  'el5': {'weight': 2},
  'el6': {'weight': 1},
  'el7': {'weight': 1}},
 'el3': {'el1': {'weight': 2}, 'el12': {'weight': 2}, 'el5': {'weight': 2}},
 'el5': {'el1': {'weight': 2}, 'el12': {'weight': 2}, 'el3': {'weight': 2}},
 'el6': {'el1': {'weight': 1}, 'el12': {'weight': 1}, 'el7': {'weight': 1}},
 'el7': {'el1': {'weight': 1}, 'el12': {'weight': 1}, 'el6': {'weight': 1}}}