2 votes

Création d'un graphe dirigé à partir d'un dictionnaire avec des scores

J'ai ce dictionnaire :

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

c'est une sorte de graphe dirigé. Par exemple, d1['a'] pointe deux fois vers 'b', et une fois vers 'c' (voir le graphique ci-dessous).

enter image description here

Ce que je veux, c'est créer deux dictionnaires à partir de d1 - pointing_to et pointed_by avec des valeurs décrivant combien de fois ils sont pointés vers ou par, respectivement.

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}
}

5voto

schwobaseggl Points 31215

Vous pouvez utiliser collections utils pour obtenir votre résultat :

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}})

Notez que les deux Counter y deafultdict sont des sous-classes de dict Ces deux éléments peuvent donc, à toutes fins utiles, être utilisés comme vos dicts de sortie souhaités.

Si vous voulez vraiment dict vous pouvez facilement le faire :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X