2017-12-05 1 views
1

私は、大きな問題を抱えている作業を開始するための機能で、私は、ツリーの最初のノードを見つける必要があり、ここでは例:ディクテーションでツリーの最初のノードを見つける方法は?

   "hi" 
      / \ 
     /  \ 
      "ok"  "no" 
     /
     /
     "lol" 

問題は、私はAからそれを取る方法を知らないということです入力は、このようなものですので、辞書は、:誰も(「こんにちは」dict.values中を持っていないので、この場合はそう

{ "ok":["lol"] , "no":[] , "hi": ["ok","no"] , "lol" : [] } 

は「こんにちは」)最初に問題はdictのことを言う方法で、最も重要な50,000ノードありますので、1つ1つチェックすると残業になります。 「「hellow」にあるがない

d = { "ok":["lol"] , "no":[] , "hi": ["ok","no"] , "lol" : [] } 
    x = d.values() 
    x = str(x) 
    for y in d.keys(): 
     if not y in x : 
      first_node = y 
      break 

が、問題はそれが「こんにちは」などの言葉と「地獄」ので「地獄」のような「キー」することができます:

は、私はこれを書きましたhellow」:(あなたはリストの内包表記を使用することができます

+0

こんにちはあなたは(でき申し訳ありません –

+1

をhellowありませんあなたの質問を代わりに編集する必要があります –

答えて

3

set.differenceを使用してこれを行う方法があります。

from itertools import chain 

d = { "ok":["lol"] , "no":[] , "hi": ["ok","no"] , "lol" : [] } 
roots = set(d).difference(chain.from_iterable(d.values())) 

あなたはランダムなノードを選択し、トップにそれに従うことができ、私たちに

{'hi'} 
+0

しかし、私は、このリストがある場合:{ 'bellissimanon':[ 'CIOを'、 'C​​IA']、 'belissima'、 'belissima':['belissimanon'] 'cia':[]}彼は 'belissima'、 'bellissimanon'}を返すが、それは "bellissima"だけでなければならない。 –

+0

@AliToccacieli Is it意図的に、あなたはそこに 'belissimanon 'の2つの異なるスペルを持っているのですか? –

+0

ええ、そのスペルミスとは、したがって、あなたは2つの開始ノードがあります – Pat

0

d = { "ok":["lol"] , "no":[] , "hi":["ok","no"] , "lol" : [] } 
root = [a for a, b in d.items() if all(a not in d for c, d in d.items())][0] 

出力:

'hi' 
+0

辞書がそうである場合は、私が書いたのと同じ問題があります: d = {"bellissimanon":["cio"、 "cia"]、 "cio":[]、 "belissima [ "belissimanon"]、 "cia":[]} 彼は私たちに恩返し: 'bellissimanon' U [1]それは2の結果を意味する "BELLISSIMA" という置く場合 –

0

を与えます。 私は、イムのはtimeitとレポート結果を何かを書いた:

d = { "ok":["lol"] , "no":[] , "hi": ["ok","no"] , "lol" : []} 

node = list(d.keys())[0] 
found = False 
while not found: 
    found = True 
    for key, value in d.items(): 
     if node in value: 
      node = key 
      found = False 

print(node) 

は、私の解決策は、テスト環境で最善を行っていることが判明:

**10 nodes** 
0.0000020000017 s - my solution 
0.0000043555594 s - using set.diffrence by Patrick Haugh 
0.0001111112098 s - list comprehension by Ajax1234 

**1000 nodes** 
0.0007560006720 s - my solution 
0.0015977791980 s - using set.diffrence by Patrick Haugh 
0.3337478522203 s - list comprehension by Ajax1234 

**10000 nodes** 
0.0077213401967 s - my solution 
0.0138804567826 s - using set.diffrence by Patrick Haugh 
35.264710457520 s - list comprehension by Ajax1234 
+0

私はとにかくこれを試してみると、魔女がもっと速くすべての人に見えるのを見ます:D –

+0

鉱山が最も速いですが、 'set.diffrence'はすべての根を見つけます – Pat

関連する問題