2016-02-25 67 views
20

鍵值配對我有一個由員工,經理作爲鍵值對的字典:合併在字典

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

我想告訴各級員工的經理之間的關係(員工的老闆,他的老闆的老闆,老闆的老闆的老闆等)用字典。所需的輸出是:

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

這是我嘗試這隻能說明第一級:

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

我可以做的另一個條件語句添加一個新的水平,但這將是一個錯誤的路要走關於它。我對字典不是很熟悉,那麼更好的方法是什麼?

+0

__I'm不是很熟悉的字典那麼這將是一個更好的辦法__ - 數據庫 – IanAuld

+0

我不知道如果有蟒蛇功能可用於這一目的,但我會使用**拓撲排序**來實現此功能。 – qmaruf

+1

參見https://en.wikipedia.org/wiki/Disjoint-set_data_structure – OozeMeister

回答

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

效果很好 - 非常感謝! – user415663

+0

我應該說這是一個有詳細細節的深思熟慮的答案。感謝這樣的答案+1。 – The6thSense

+0

什麼是[j]語法和「while D in D」?看起來我是新手。 –

7

你可以使用這個概念遞歸爲:

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

,然後訪問的層次結構:

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

但是必須小心,因爲這可能會得到一個無限循環如果我們在字典中有一項作爲"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]) 

打印d

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