邻居的邻居列表(让我们称之为two_nei
)。
每个two_nei
(称为cn
)的常见邻居数量。
创建dict
,每个节点作为键,list
包含所有邻居作为值(neighbor_dictionary
)。
创建一个dict
,每个节点作为密钥,list
包含邻居的所有邻居(此节点为two_nei
)作为值({{1} })。
现在我想创建一个second_dictionary
(因为不知道该怎么做),图中的每个节点都有一个list
。这些字典中的每一个都将包含节点的每个dict
作为键,值将是它们具有的常见邻居的数量。
正如您所看到的,这很容易变得复杂。我相信在python中有一种更简单,更优雅的方法。我是一个数学家,我既没有数据结构也没有算法,但我相信我们可以使用队列来解决这个问题。
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
这是一个函数,它返回图中两个节点的共享第二个邻居的数量。它使用networkx作为图表。根据每个节点中的数据量以及图表的密集程度,这可能无效,因为它会在内存中创建可能较大的集合。
def num_shared_second_neighbors(graph, node1, node2):
"""Number of second neighbors shared by node1 and node2 in graph."""
return len(set(second_neighbors(graph, node1)).intersection(set(second_neighbors(graph, node2))))
def second_neighbors(graph, node):
"""Yield second neighbors of node in graph.
Neighbors are not not unique!
"""
for neighbor_list in [graph.neighbors(n) for n in graph.neighbors(node)]:
for n in neighbor_list:
yield n
函数second_neighbors
是一个生成器,它通过执行简单的图遍历来生成节点的非唯一第二邻居。函数num_shared_second_neighbors
只返回两个节点的秒邻居集合交集中的节点数。
答案 1 :(得分:0)
以下是使用 NetworkX 编写的所需函数:
def get_second_neighbors(graph, node) -> list:
"""
Returns a list of unique second neighbors for a given node in the graph.
"""
return [second_neighbor
for first_neighbor in graph.neighbors(node)
for second_neighbor in graph.neighbors(first_neighbor)
if second_neighbor != node])
def get_num_shared_neighbors(graph, node1, node2) -> int:
"""
Returns a number of second neighbors shared by node1 and node2 in the graph.
"""
return len(set.intersection(set(get_second_neighbors(graph, node1)),
set(get_second_neighbors(graph, node2))))
我希望列表理解使它优雅并且易于理解。