-2

次のような辞書から家系図を作成する最も速い方法は何ですか?

family = [
    {'name': 'a', 'parent': ''},
    {'name': 'b', 'parent': 'a'},
    {'name': 'c', 'parent': 'a'},
    {'name': 'd', 'parent': 'b'},
    {'name': 'e', 'parent': 'd'},
    {'name': 'f', 'parent': ''},
    {'name': 'g', 'parent': 'f'},
    {'name': 'h', 'parent': 'a'}
]

最終的に、私はそれを印刷しようとしています(追加情報がたくさんありますが、これは一般的な考えです)、次のようなリストです:

a
  b
    d
      e
  c
  h
f
  g

親が見つかった各項目で .pop() を使用して、リストが空になるまでリストをループする関数を作成するソリューションはありますか? または、Pythonでより良い方法がありますか?

これはもっと大きな問題の一部ですが、私はこの小さな部分を解決する最善の方法を見つけようとしています. したがって、ラムダの悪夢でさえおそらく可能です。簡単に拡張できるクリーンな方法で答えてみてください:)

4

2 に答える 2

1

警告 - これは悪い解決策です

代わりに、@Blckknght からの以下の回答を使用してください。これは、不適切な形式のデータ構造に依存しているため、O(N**2) で実行される貧弱なソリューションです。

ルート ノードを受け取り、そのノードのすべての子を出力してから、それ自体を呼び出す再帰関数を使用する必要があります。以下のようなもの。家族の口述をその場で編集しようとしないでください。あなたの人生を必要以上に難しくするだけです。

以下の機能のようなものはあなたのために働くかもしれません。これは簡単な例にすぎず、かなりの量のエラー処理を追加する必要があることに注意してください。これは、サイクルまたは owt が発生した場合にエラーが発生しないようにするためです。

INDENT = ' ' #Change this to taste

def print_family(parent,family,indent=0):
    for child in family:
        if child['parent'] == parent:

             # Print here
             print '%s%s' % (INDENT * indent,child['name'])

             # Call on the child
             print_family(child['name'],family,indent + 1)

# Kick it off with the root node
print_family('',family)
于 2013-11-11T09:32:55.213 に答える