如何将NetworkX代码输出的多个字典合并为单一字典
问题
现有基于NetworkX的Python代码如下:
import networkx as nx import math G = nx.read_gml(".../networks/karate.gml",label=None) X = nx.single_source_shortest_path_length(G,5,2) t = 0 for x in X: if (34,x) in G.edges() or (x,34) in G.edges(): t += 1 l = dict() l[x] = t + math.log10(5) print(l)
运行后会输出多个仅含单个键值对的字典:
{5: 1.6989700043360187} {1: 1.6989700043360187} {11: 2.6989700043360187} {7: 3.6989700043360187} {32: 4.698970004336019} {2: 5.698970004336019} {3: 6.698970004336019} {4: 7.698970004336019} {6: 8.698970004336019}
需要修改代码,将这些输出合并为一个完整的字典,预期输出如下:
{5: 1.6989700043360187, 1: 1.6989700043360187, 11: 2.6989700043360187, 7: 3.6989700043360187, 32: 4.698970004336019, 2: 5.698970004336019, 3: 6.698970004336019, 4: 7.698970004336019 ,6: 8.698970004336019}
解决方法
核心改动是将字典的初始化移到循环外部,避免每次循环新建空字典,而是在同一个字典中累加键值对,最后统一打印完整字典。修改后的代码如下:
import networkx as nx import math G = nx.read_gml(".../networks/karate.gml", label=None) X = nx.single_source_shortest_path_length(G, 5, 2) t = 0 # 初始化空字典,放在循环外 result_dict = {} for x in X: if (34, x) in G.edges() or (x, 34) in G.edges(): t += 1 # 直接向结果字典添加键值对 result_dict[x] = t + math.log10(5) # 循环结束后打印完整字典 print(result_dict)
改动说明:
- 把原循环内的
l = dict()移到循环前,命名为result_dict更符合语义 - 循环内不再新建字典,直接给
result_dict赋值键值对 - 移除循环内的
print(l),改为循环结束后打印整个result_dict
运行后即可输出合并后的完整字典,符合预期需求。
内容的提问来源于stack exchange,提问作者user19092610
相关产品推荐
相关产品推荐

