2011-02-13 13 views
5

Ben aşağıdaki alanlarıPython'da bir ağacı hareket ettirmenin en etkili yolu nedir?

değeri

ebeveyn ve bu bir dizin ağacına benzer bir ağaç yapısını tanımlar sahip nesnelerin bir listesi var varsayarsak.

Listeyi ön siparişte taşımak istiyorum. En verimli yol nedir?

Normalde, diğer (daha fazla zorlayıcı) dillerde, ebeveynleri olmayanları bulmak, sonra her biri için, şu anda bakmakta olduğum ve benzerleri olan her nesne için tekrar yineleme, değerleri yinelemek, ama bunu Python'da yapmanın daha akıllıca bir yolu var mı?

cevap

7

Ben ilk daha uygun veri yapısını yaratacak - onun çocuklarına bir ebeveynden bağlantıyı yakalayan:

children = {} 
for obj in tree: 
    children.setdefault(obj.parent, []).append(obj) 

def preorder(root, children): 
    yield root.value 
    for child in children.get(root, []): 
     for value in preorder(child, children): 
      yield value 

for root in children[None]: 
    for value in preorder(root, children): 
     print value 

Ayrıca buradan collections.defaultdict kullanabilirsiniz.

+4

Sanırım, özel kasa olmadan “obj.parent yok” seçeneğinde daha hoş olurdu. Daha az kod, daha hızlı ve aynı zamanda bir ormandan ziyade bir ormanı idare edebilir ('çocuklar [Yok]' tüm ağaç köklerinin listesidir). – 6502

+0

Mükemmel! Sana deðiþebilmesi eklersiniz: \t \t def ön sipariş vermek (kök, çocuk, derinlik): \t \t verim [root.value, derinlik] \t \t çocuk için children.get içinde (kök, []) : preorderda değere (çocuk, çocuklar, derinlik + 1) için \t \t : Ön sipariş sonucu değil, aynı zamanda ne kadar derin ev sadece görebiliyordu \t \t verim değeri \t \t ve bu şekilde ery düğümü. İlk aramanın ön sipariş olması gerektiğini unutmayın (root, children, 0) Çok teşekkürler! ** Düzenle **: Urgh. Kod yanıtlarken gerçekten dağınık görünüyor. – Bruno