辞書

2016-02-25 21 views
20

内のキーと値ペアリング私は、キーと値のペアとして、従業員、マネージャで構成された辞書を持っているのマージ:辞書

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

私はすべてのレベル(従業員の上司で、従業員、マネージャーとの関係を示したいと思います、彼の上司の上司、彼の上司の上司の上司など)が辞書を使用しています。所望の出力は次のようになります。私は次のレベルを追加するために、別の条件文を行うことができますが、これは行くには間違った方法だろう

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

:ここ

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

は、最初のレベルのみを示した私の試みですそれについて。私は辞書にあまり慣れていないので、よりよいアプローチは何でしょうか?

+0

__I'm辞書に精通していないので、何がより良いアプローチでしょう__ - 私は任意のPythonの関数は、この目的のために利用可能であるかどうかわからないですデータベース – IanAuld

+0

、しかし? ** topological sorting **を使用してこの機能を実装します。 – 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 j 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']}