2017-01-14 21 views
5

は、関数は、入力として辞書にかかります、と私は辞書内の最長パスの長さを見つけたいです。基本的に、辞書内でkey2がvalue1と一致し、key3がvalue2と一致すると、これはパスとしてカウントされます。例えば:上記の場合パイソン - 見つける最長パス

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

、長さが3であるべきです。どうすればこれを達成できますか?または、具体的にどのように私はキーと値を比較するでしょうか?事前に

多くのおかげで(これは何も、文字列、数値など、数字だけではないかもしれません)!

+0

:あなたのような何かができる何かをインポートしますか? – alfasin

+0

他の方法を調べる方法がわかりません...プログラミングが初めてです – aRandomStudent

+0

ループがある可能性はありますか? '{' a ':' b '、' b ':' c '、' c ':' d '、' d ':' a '} '? – DyZ

答えて

5

私は非循環有向グラフ(DAG)のエッジのリストとして辞書を扱い、グラフの最長経路を見つけるためにnetworkxモジュールを使用します。あなたがいないの主張している場合

import networkx as nx 

data = {'a':'b', 'b':'c', 'c':'d'} 

G = nx.DiGraph() 
G.add_edges_from(data.items()) 
try: 
    path = nx.dag_longest_path(G) 
    print(path) 
    # ['a', 'b', 'c', 'd'] 

    print(len(path) - 1) 
    # 3 
except nx.exception.NetworkXUnfeasible: # There's a loop! 
    print("The graph has a cycle") 
+0

これは正確に動作します!申し訳ありませんが、これは元の投稿でこれを述べたはずですが、モジュールを使用せずにこれを行う方法はありますか? – aRandomStudent

+0

する必要があります。しかし、なぜ? 'networkx'の機能を再実装する必要があります。 – DyZ

+1

あなたはまだそれのために行くことにした場合、長く曲がりくねった道を進んでいる、とここで開始する場所です。http://stackoverflow.com/questions/21880419/how-to-find-the-longest-simple-path-グラフ内 – DyZ

1

をあなたは「キーと値を比較」する必要がない理由

def find_longest_path(data): 
    longest = 0 
    for key in data.iterkeys(): 
     seen = set() 
     length = -1 
     while key: 
      if key in seen: 
       length = -1 
       raise RuntimeError('Graph has loop') 
      seen.add(key) 
      key = data.get(key, False) 
      length += 1 
     if length > longest: 
      longest = length 

    return longest 
+0

'(「グラフがループを持っている」)RuntimeErrorを送出 '作る'長= -1' 「休憩」は不要です。 – DyZ

+0

あなたは正しいです。私は質問を再読した後に 'RuntimeError'を追加しました。 – Batman

関連する問題