2009-04-23 12 views
2

私は今のところ目が見えないので、ここで質問する必要があります。私はそれがツリーノードのリストのflattendリストとして木の表現になるように、そのタプルのリストからツリーを作成する

(id, parent_id, value) 

のように見えるタプルのリストをソートしたいです。

例えば

(1, None, '...') 
(3, 2', '...') 
(2, 1, '...') 
(4, 1, '...') 
(5, 2, '...') 
(6, None, '...') 

入力べきで任意のヒントが高く評価されるだろうその後

(1, None, '...') 
(2, 1, '...') 
(3, 2', '...') 
(5, 2, '...') 
(4, 1, '...') 
(6, None, '...') 

そのようなソート。前もって感謝します。

+0

どのような種類のツリーですか?これまでに何を試しましたか? ...現在の実装を使用するだけではどうですか? –

+0

どのような並べ替えですか? 2つ以上のルートノードを持つ一面のツリーですか?よくわかりません。 –

+0

基本的に、私はこれをデータベースから取得します。どのような種類の木を終わらせることができない、それはよりバランスが取れているか、そういうものなのです。これはファイルシステムツリーのようなものです。現在の実装ではどういう意味ですか? –

答えて

2

Pythonはタプルを左から右にソートします。したがって、タプルを並べ替えて最初のソートキーが最初のアイテムとなるようにすると、それは合理的に効率的になります。

タプルのリストからツリーへのマッピングは、あなたが記述しているものからは明確ではありません。それを引き出すか、より完全に説明してください。たとえば、あなたの例があるように思われる:

tree diagram http://web.sabi.net/temp/tree.png

をあなたが親を持たない二つのノードを持っていれば、それはより多くの木よりも森のようなものです。あなたは木で何を表現しようとしていますか?この文脈で「並べ替え」とは何を意味しますか?

+0

はい、本質的には木々の森です。リストの各タプルはアイテムであり、そのタプルはその親として別のタプルを持つことができます。あなたの写真はそれを正しくモデル化します。これはファイルシステムのビューに匹敵し、私が作成したいものです。 –

+0

OK、どうやってフォレストを並べ替えるのですか?それはあなたが多かれ少なかれ、あらかじめ辿って行き渡っているように見え、次にIDで根を並べ替えるように見えますか?もしそうなら、ソートを容易にする別の表現、例えばキーがノードIDであるネストされた辞書を使用することを検討することをお勧めします。必要に応じて、辞書をタプル表現のリストにまとめることができます。 –

1

私はあなたがしていることを正確に追いかけてきましたが、ノードのリストとしてフォレストを持っていれば、それを読んでツリー構造を構築して書き込むことはできませんすべての木のパンの最初の横断として出る?これを避ける特別な理由はありますか?

+0

いいえ、私はこのアプローチをとらなければならないと思います。私がスキップしたかったのは、10.000のタプル(別名データベース行)のリストがある可能性のある状況でした。これを辞書のベースフォレストに入れ、タプルのリストを再度作成します。 –

0

私が正しく理解していればオリバーは、私はあなたが (a)は、辞書またはリストにあなたのデータベースからすべてのタプルを取得し、その後、ツリーを構築、とき OR (b)は、ORDER BY句を使用することができますどちらかだと思いますタプルを検索して、ツリーに追加する順番に並べ替えます。

アプリケーションにツリーの変更を加えてデータベースに伝播させる場合、私はaを選択しますが、データベースの挿入、更新、削除などの変更は常に行われ、 - だけでは、オプションbはより速く、必要なリソースは少なくてすみます。

ローランド

関連する問題