python-3.x - 有没有办法根据节点是否具有共享属性来形成节点之间的连接?
问题描述
我的目标是编写一个程序,该程序以未连接的节点网络开始,每个节点可能具有相同或不同的属性。然后,如果节点具有共享属性,则将形成一条边。到目前为止,我已经浏览了网络包,似乎没有一种简单的方法可以实现这一点。如果有人对如何做到这一点有任何想法,我将非常感谢您的帮助!
import networkx as nx
import matplotlib.pyplot as plt
import random
know_list = ["a", "b", "c", "d"]
G = nx.Graph()
for i in range(1,5):
G.add_node(i, knowledge = know_list[i-1])
#nx.draw(G)
#plt.show()
knowledge=nx.get_node_attributes(G, 'knowledge')
print(knowledge)
G.add_node(5, awareness = random.choices(know_list, k=2))
awareness = nx.get_node_attributes(G, 'awareness')
print(awareness)`
#返回节点5的意识字典后的目标是将意识字典中的内容与知识字典进行比较(注意get_node_attributes返回一个字典,其中节点作为键,know_list中的元素作为项目)。如果感知字典中的元素与节点的知识属性相同,则在两者之间添加一条边。例如,假设随机选择给出意识 = [a,b]。在这种情况下,节点 5 将与节点 1 和 2 形成连接,因为节点 1 具有 [a] 的知识,而节点 2 具有 [b] 的知识。但是,节点 5 不会与节点 3 或 4 形成连接,因为它们不是意识字典中包含的元素。我希望这能澄清一些事情,让我知道它是否仍然令人困惑。
解决方案
从您共享的图表开始:
know_list = ["a", "b", "c", "d"]
G = nx.Graph()
for i in range(1,5):
G.add_node(i, knowledge = know_list[i-1])
nx.draw(G, with_labels=True, node_size=500, node_color='lightgreen')
您可以反转属性返回nx.get_node_attributes
的映射:knowledge
knowledge={j:i for i,j in nx.get_node_attributes(G, 'knowledge').items()}
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
G.add_node(5, awareness = random.choices(know_list, k=2))
awareness = nx.get_node_attributes(G, 'awareness')
# {5: ['b', 'a']}
然后通过迭代,您可以通过使用以下方法在内部列表中awareness
查找节点来轻松添加新边:knowledge
add_edge
for k,v in awareness.items():
for node in v:
G.add_edge(k,knowledge[node])
nx.draw(G, with_labels=True, node_size=500, node_color='lightgreen')
推荐阅读
- firebase - Firebase - 如果用户属性发生更改,用户是否会从受众中删除
- facebook - 创建在社交网络上分享时每天更新的网页图像(如屏幕截图)
- android - Android Studio:styles.xml 中未解析的符号“主题”
- c# - 错误构建 VSTS:## [错误] 错误:无法找到“nuget”
- opencl - OpenCL 多维
- powershell - 如何在目录中的多个文件夹中搜索 .ps1 文件
- javascript - 在画布中通过 for 循环创建形状
- java - 在java中的倒数程序中检查逻辑0
- django - 允许用户使用 django boto3 从 AWS 下载文件,我做错了什么?
- objective-c - 在objective-c或swift中覆盖pod文件方法的最佳实践是什么?