2016-02-25 15 views
20

Ho un dizionario che si compone di impiegato-manager come coppie chiave-valore:Unione di valori-chiave Accoppiamenti nel dizionario

{'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'} 

voglio mostrare le relazioni tra dipendenti-manager a tutti i livelli (il capo di dipendenti, il capo del suo capo, il capo del capo del suo capo, ecc.) usando un dizionario. L'output desiderato è:

{'a': [b,d,f], 'b': [d,f], 'c': [d,f], 'd': [f] } 

Ecco il mio tentativo che mostra solo il primo livello:

for key, value in data.items(): 
    if (value in data.keys()): 
     data[key] = [value] 
     data[key].append(data[value]) 

posso fare un'altra dichiarazione condizionale per aggiungere il livello successivo, ma questo sarebbe il modo sbagliato di procedere a proposito. Non ho molta familiarità con i dizionari, quindi quale sarebbe un approccio migliore?

+0

__I'm non molto familiare con dizionari in modo che quello che sarebbe un approccio migliore __ - Un database – IanAuld

+0

Non sono sicuro se qualsiasi funzione Python è disponibile per questo scopo, ma Vorrei utilizzare ** l'ordinamento topologico ** per implementare questa funzionalità. – qmaruf

+1

Vedere anche https://en.wikipedia.org/wiki/Disjoint-set_data_structure – OozeMeister

risposta

11
>>> D = {'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'} 
>>> res = {} 
>>> for k in D: 
...  res[k] = [j] = [D[k]] 
...  while j in D: 
...   j = D[j] 
...   res[k].append(j) 
... 
>>> res 
{'b': ['d', 'f'], 'c': ['d', 'f'], 'd': ['f'], 'a': ['b', 'd', 'f']} 
+0

Che funziona bene - grazie mille! – user415663

+0

Devo dire che questa è una risposta ben pensata con dettagli minuti. Grazie per questa risposta +1. – The6thSense

+0

Qual è la sintassi [j] e "while j in D"? Sembra che sono un principiante. –

7

È possibile utilizzare il concetto di ricorsione come:

def get_linked_list(element, hierarchy, lst): 
    if element: 
     lst.append(element) 
     return get_linked_list(hierarchy.get(element, ""), hierarchy, lst) 
    else: 
     return lst 

E poi accedere alla gerarchia:

>>> d = {'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'} 
>>> print {elem:get_linked_list(elem, d, [])[1:] for elem in d.keys()} 
>>> {'a': ['b', 'd', 'f'], 'c': ['d', 'f'], 'b': ['d', 'f'], 'd': ['f']} 

Tuttavia la cura deve essere presa come questo può arrivare a un ciclo infinito se abbiamo un articolo nel dizionario come "a": "a"

1
x={'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'} 
d={} 
l=x.keys() 
for i in l: 
    d.setdefault(i,[]) 
    d[i].append(x[i]) 
    for j in l[l.index(i)+1:]: 
     if j==d[i][-1]: 
      d[i].append(x[j]) 

stampa d

uscita:? {'a': ['b', 'd', 'f'], 'c': ['d', 'f'], 'b': ['d', 'f'], 'd': ['f']}