考虑元组列表。此列表将转换为字典,其中主键为节点和边。
示例:
ls = [('a', 1), ('b', 2), ('c', 3), ('a', 2), ('b', 3)]
为了获得此结果,我导入了networkx
库。
import networkx as nx
G = nx.Graph()
G.add_edges_from(ls)
但是,当我将 G图转换为node_link_data
时:nx.readwrite.json_graph.node_link_data(G)
我发现有些项目(源和目标)是倒置的,例如,元组列表被分类为源而不是目标
# original tuple
('b', 2)
# node_link_data
links: [
{'source': 2, 'target': 'b'}
...
]
因此,我创建了自己的字典{'nodes': [], 'links': []}
。
我想使用此字典来创建networkx图。我对使用此库的算法测量节点感兴趣。
我尝试使用:
G = nx.Graph(myDict)
这将返回错误:TypeError: Input is not known type
如何使用已经包含节点和边的字典来构建此图?也许我可以使用其他库来测量度数,聚类等...而是使用其他库。预先感谢
答案 0 :(得分:0)
因此,问题似乎是某些元组的组织方式不正确,无法从列表到字典进行一致的转换,因此您可以像这样测试元组的索引
ls = [('a', 1), (2, 'b'), (3, 'c'), ('a', 2), ('b', 3)]
links = []
for i in ls:
try:
if i[0].isalpha():
links.append({'source': i[1], 'target': i[0]})
except AttributeError:
links.append({'source': i[0], 'target': i[1]})
print(links)
# [{'source': 1, 'target': 'a'}, {'source': 2, 'target': 'b'}, {'source': 3, 'target': 'c'}, {'source': 2, 'target': 'a'}, {'source': 3, 'target': 'b'}]
会发生什么情况,我们测试i[0]
的字母是否带有至少一个字符,如果是,则将其追加到目标,并将i[1]
追加到源。另一方面,如果碰巧是int
,则会引发错误,我们可以使用try/except
来捕获该错误,这现在告诉我们int在i[0]
中,因此我们可以创建i[0]
为源,i[1]
为目标的字典。