【问题标题】:Transforming network graph to another structure将网络图转换为另一种结构
【发布时间】:2021-09-29 05:28:49
【问题描述】:

我有一个边列表表示如下图网络:

输入:[(A,1),(A,2),(B,1)(B,2)(C,2)(C,3)]

将其转换为以下列表的最佳方法是什么:

输出:[(A,B,2),(B,C,1),(A,C,1)]。在输出列表中,条目代表2个节点和相似度测量另一组节点。

Input 列表表示下图中的第一个图,Output 列表表示节点之间的关联(图中的图 2)。

这就是我所做的,我在输入列表上使用了自连接并尝试计算条目以计算边缘值。

但是,在这种情况下,我得到了很多冗余条目(因为加入),当我有很多数据时它就无效了。

Self Join 就像: (A,1),(B,1) 在我加入数字节点时给出 (A,1, B)。之后,我必须计算相同的结果才能得到边缘值

【问题讨论】:

  • 欢迎来到 SO。我们不会在没有尝试和没有代码的情况下回答问题,请参阅How to ask
  • 哦,请原谅我,感谢您提到“如何询问文件”。这是我所做的,我在输入列表上使用了自连接并尝试计算条目以计算边缘值。但是,在那种情况下,我得到了很多冗余条目(因为加入),当我有很多数据时它是无效的。
  • 自加入就像: (A,1),(B,1) 在我加入数字节点时给出 (A,1, B)。之后,我必须计算相同的结果才能得到边缘值
  • 您能否编辑您的问题并将此信息包含在问题本身中?

标签: algorithm graph-theory


【解决方案1】:

我们可以通过建立一个连接到每个数字顶点的所有字母顶点的列表来获取您想要的信息;然后对于同一列表中存在的每一对字母顶点,将该对的相似度计数器加 1。

我使用标准dict.setdefault 方法来存储连接到adjacency_dict 中每个数字顶点的字母顶点列表。

我使用defaultdict 将相似性计数存储在sim_dict 中。 dict + setdefaultdefaultdict 之间的选择完全取决于口味;因为我的代码中有两个字典,所以我用了一个来展示它们的易用性。至于我的个人品味,我喜欢dict.setdefault dict 包含可变对象(例如列表),我更喜欢defaultdict dict 包含非可变对象(例如整数)。请注意,由于sim_dict 持有计数,因此使用Counter 也是合适的。

为了查找同一列表中存在的所有可能的字母顶点对,我使用itertools.combinationssorted 来确保组合始终按字母顺序排列——因此('A', 'C') 不能被视为不同比('C', 'A').

import itertools    # combinations
import collections  # defaultdict

edge_list = [('A',1),('A',2),('B',1),('B',2),('C',2),('C',3)]

adjacency_dict = {}
for letter,num in edge_list:
  adjacency_dict.setdefault(num, []).append(letter)

print(adjacency_dict)
# {1: ['A', 'B'], 2: ['A', 'B', 'C'], 3: ['C']}

sim_dict = collections.defaultdict(int)
for l in adjacency_dict.values():
  for a,b in itertools.combinations(sorted(l), 2):
    sim_dict[(a,b)] += 1

print(sim_dict)
# defaultdict(<class 'int'>, {('A', 'B'): 2, ('A', 'C'): 1, ('B', 'C'): 1})

sim_list = [(a,b,s) for (a,b),s in sim_dict.items()]

print(sim_list)
# [('A', 'B', 2), ('A', 'C', 1), ('B', 'C', 1)]

相关文档:

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多