2

リストのネストされたリストから文を再帰的に出力しようとしています

を含むリストを取得したい

[「大きな悪い犬」、「大きなフワフワ猫」、「小さな青い幸せなポニー」、「小さなカエル」]

ここに私のコードがありますが、動作しません...

私は正しい道を進んでいますか、それとも目標を達成するために別の方法でデータを構造化する必要がありますか?

from pprint import pprint

dirs = [

{ 
    'kw': 'big',
    'childs': [
        { 
            'kw': 'bad',
            'childs': [
                {
                    'kw': 'dog'
                }
            ]
        },
        {
            'kw': 'fluffy',
            'childs': [
                {
                    'kw': 'cat'
                }
            ]
        }

    ]
},

{ 
    'kw': 'small',
    'childs': [
        { 
            'kw': 'blue',
            'childs': [
                {

                    'kw': 'happy',
                    'childs': [
                        { 
                            'kw': 'pony'

                        }

                    ]
                }
            ]
        },
        {
            'kw': 'frog'

        }

    ]
},
]


def traverse(d, l):

    kw = d.get('kw')
    c = d.get('childs')
    l.append(kw)
    if c:
        for cc in c:
           l = traverse(cc, l)



return l


r = traverse(dirs[0], [])

pprint(r)
4

5 に答える 5

2

この機能をチェックしてください:

def traverse(d, l, s = None):
  kw = d.get('kw')
  c = d.get('childs')
  if(s == None):
     s = kw
  else:
     s = s + " " +kw
  if c:
      for cc in c:
          l = traverse(cc, l, s)
  else:
      l.append(s)

  return l 

再帰関数に対する非常に小さな変更です。

r = traverse(dirs[0], [])
于 2013-08-16T05:10:41.103 に答える
2

いつものように、ジェネレーターは再帰構造でうまく機能します

def traverse(i):
    for d in i:
        childs = d.get('childs')
        for j in traverse(childs) if childs else ['']:
            yield d['kw']+' '+j

res = list(traverse(dirs))

Python3.3 では、これは

def traverse(i):
    for d in i:
        c = d.get('childs')
        yield from (d['kw']+' '+j for j in (traverse(c) if c else ['']))
于 2013-08-16T05:45:12.487 に答える
0

ああ、Gnibbler は私を発電機のハットチップに打ち負かしました。言及する価値がある唯一の違いは、" ".join で文をつなぎ合わせることと、if テストを回避するための *syntax です。

def traverse_keys(*dictvalues):
    for dictval in dictvalues:
        for token in traverse_keys(*dictval.get('childs', [])):
            yield token
        kw = dictval.get('kw')
        if kw: yield kw

tokens = [kw for kw in traverse_keys (*dirs)]
tokens.reverse()
print " ".join(tokens)

子に複数のブランチが必要ない場合は、辞書を直接ネストするだけで済みます。ロジックには、現在の構造のどのブランチを選択する方法がありません。辞書をネストするだけで、ブランチに名前を付けることができます。

{ 'kw': 'dog'
  'big': { 'kw': 'scary' } 
  'small': { 'kw': 'yippy',  'fluffy': { 'kw': 'poodle'} }
}

これにより、トラバーサルがよりクリーンになります

于 2013-08-16T05:59:37.437 に答える