1

私はここで新しく、Pythonはかなり新しいです!

私たちは宿題を手に入れました、そして私はすでにそれの残りをすることができました、しかし1つの問題が残っています:私がこのようなツリー階層を持っているならば:

root = [
    parent1 = [
        child1,
        child2 = [
            sub_child
        ]
        child3
    ],
    parent2 = [
        child1,
        child2
    ]
]

そして、それらはすべて、という名前の1つのクラスのインスタンスでTreeHierarchyClassあり、すべてにname属性があります。入力した名前のクラスを見つけるにはどうすればよいですか?

forループを使おうとしましたが、必要な数を知る方法がありませんか?名前の取得は簡単です。

name = input("Enter name: ")
if name == TreeHierarchyObject.name:
    print("Found it!")

しかし、どうすればオブジェクトをループできますか?

4

2 に答える 2

4

ここでは単純な再帰を使用する必要があります。メソッドは、子オブジェクトが親オブジェクトにどのようにアタッチされているかによって少し異なります。

これは、それらがリストself.childrenにある場合に機能します。これを行うことをお勧めします。クラス内で次のメソッドを定義するだけです。

def findObjectByName(self, name):
    if self.name == name:
        return self
    else:
        for child in self.children:
            match = child.findObjectByName(name)
            if match:
                return match

編集: 名前だけでなく、任意の属性に対してこれを機能させるには、getattr()代わりに次を使用します。

def findObject(self, attr, value):
    if getattr(self, attr) == value:
        return self
    else:
        for child in self.children:
            match = child.findObject(attr, value)
            if match:
                return match

or を呼び出すだけでroot.findObjectByName("Sub Child!")、2 番目のメソッドを使用できます。root.findObject("name", "Sub Child!")

于 2012-12-04T20:23:03.780 に答える
2

使用することも、使用するrecursionこともできますiteration。どちらでも構いません。ただし、ツリーを検索するには戦略が必要です。

グラフを通過するためのいくつかの戦略を次に示します。

主なアイデアは、同じノード/リーフを2回通過しないことです。これは、ツリーでは簡単ですが、coloringグラフでは必要です。

パターンなど、使用できるデザイン パターンがいくつかあります。そのサブノードにアクセスするメソッドと、名前でノードを検索visitorするメソッドを追加.visit()します。TreeHierarchyClass

例:

# imagine we got this class
class TreeHierarchyClass(object):
    def __init__(self, value):
        self.children = []
        self.value = value
        if self.value == 13:
            self.name = 'the lucky one.'
    def add(self, value):
        self.children.append(type(self)(value))

次の方法ですべてのノードにアクセスできます。

def visit(tree):
    visited = set()
    nonvisited = set()
    nonvisited.update(tree.children)
    while nonvisited:
        item = nonvisited.pop()
        # already seen
        if item in visited:
            continue
        # mark item
        visited.add(item)
        yield item
        # add children
        nonvisited.update(item.children)

サンプルツリー構造を構築しましょう:

root = TreeHierarchyClass(0)

for i in range(10):
    root.add(i)

for i in range(10):
    root.children[1].add(i + 10)

それでは、いくつかのアイテムを見つけてみましょう。

def find(name):
    for item in visit(root):
        print 'checking item with value %d' % item.value,
        if getattr(item, 'name', None) == name:
            print '- found it.'
            break
        else:
            print '- nope, keep searching.'
    else:
        print 'Sorry, not found.'

find('the lucky one.')
find('the lost one.')

この例では次のように出力されます。

>>> find('the lucky one.')
checking item with value 7 - nope, keep searching.
checking item with value 0 - nope, keep searching.
checking item with value 1 - nope, keep searching.
checking item with value 12 - nope, keep searching.
checking item with value 2 - nope, keep searching.
checking item with value 9 - nope, keep searching.
checking item with value 19 - nope, keep searching.
checking item with value 3 - nope, keep searching.
checking item with value 11 - nope, keep searching.
checking item with value 4 - nope, keep searching.
checking item with value 14 - nope, keep searching.
checking item with value 5 - nope, keep searching.
checking item with value 6 - nope, keep searching.
checking item with value 15 - nope, keep searching.
checking item with value 8 - nope, keep searching.
checking item with value 16 - nope, keep searching.
checking item with value 13 - found it.
>>> find('the lost one.')
checking item with value 7 - nope, keep searching.
checking item with value 0 - nope, keep searching.
checking item with value 1 - nope, keep searching.
checking item with value 12 - nope, keep searching.
checking item with value 2 - nope, keep searching.
checking item with value 9 - nope, keep searching.
checking item with value 19 - nope, keep searching.
checking item with value 3 - nope, keep searching.
checking item with value 11 - nope, keep searching.
checking item with value 4 - nope, keep searching.
checking item with value 14 - nope, keep searching.
checking item with value 5 - nope, keep searching.
checking item with value 6 - nope, keep searching.
checking item with value 15 - nope, keep searching.
checking item with value 8 - nope, keep searching.
checking item with value 16 - nope, keep searching.
checking item with value 13 - nope, keep searching.
checking item with value 17 - nope, keep searching.
checking item with value 10 - nope, keep searching.
checking item with value 18 - nope, keep searching.
Sorry, not found.
于 2012-12-04T20:53:35.017 に答える