python - 从带有分数的字典创建有向图

标签 python python-3.x

我有这本字典:

d1={
'a':['b','c','b'],
'b':['a','d','e']
}

它是一种有向图。例如,d1['a'] 两次指向 'b',一次指向 'c'(见下图)

enter image description here

我想要的是从 d1 创建两个字典 - pointing_to 和 Pointing_by ,其值分别描述它们指向或指向的次数。

pointing_to={
'a':{'b':2,'c':1},
'b':{'a':1,'d':1,'e':1},
}

pointed_by={
'a':{'b':1},
'b':{'a':2},
'c':{'a':1},
'd':{'b':1},
'e':{'b':1}
}

最佳答案

您可以使用一些collections utils 获取输出:

from collections import Counter, defaultdict

d1 = {'a': ['b', 'c', 'b'], 'b': ['a', 'd', 'e']}

pointed_to = {k: Counter(v) for k, v in d1.items()}
pointed_from = defaultdict(dict)
for k, v in pointed_to.items():
    for k_, v_ in v.items():
        pointed_from[k_][k] = v_

# pointed_to
{'a': Counter({'b': 2, 'c': 1}), 
 'b': Counter({'d': 1, 'a': 1, 'e': 1})}

# pointed_from
defaultdict(<class 'dict'>, {'d': {'b': 1}, 
                             'a': {'b': 1}, 
                             'c': {'a': 1}, 
                             'b': {'a': 2}, 
                             'e': {'b': 1}})

请注意,Counterdeafultdict 都是 dict 的子类,因此无论出于何种意图和目的,这两个都可以用作您的所需的输出字典。

如果你真的想要 dict 对象,你可以轻松做到:

pointed_to = {k: dict(v) for k, v in pointed_to.items()}
pointed_from = dict(pointed_from)

关于python - 从带有分数的字典创建有向图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53697460/

相关文章:

python-3.x - 使用 git+ssh 进行 Pip 安装不适用于 python 包

python-3.x - 我如何知道今天是否是由于更改民用本地时间而导致的一天,例如标准 python 和 pandas 时间戳中的夏令时?

c++ - 如何使用 "conflicting types"解决 C++/C 编译期间的 `python setup.py build` 错误?

python - 构建可插入应用程序 : how to include forks of popular libraries and prevent name conflicts?

python - 是否可以使这个 shell 脚本更快?

python - 如何在自定义 handler500 中获取异常?

python - 如何为多人游戏的赢/输报告组织 MySQL 表

Python:从 Gevent Greenlet 获取值(value)

python - 使用 python3 在文本文件中查找信息

python 3 : How can I get news articles that contain a certain keyword