0

Reddit 送信からネストされたコメントを取得できる再帰関数を作成しようとしています。私はPython + PRAWを使用しています

def _get_comments(comments, ret = []):
    for comment in comments:
        if len(comment._replies) > 0:
            return _get_comments(tail(comments), ret + [{
                #"body": comment.body,
                "id": comment.id,
                "author": str(comment.author),
                "replies": map(lambda replies: _get_comments(replies, []), [comment._replies])
                }])
        else:
            return ret + [{
                    #"body": comment.body,
                    "id": comment.id,
                    "author": str(comment.author)
                }]
    return ret

def tail(list):
    return list[1:len(list)]

そして、次の出力が得られますが、これは不完全で、ネストされた配列があります。

pprint(_get_comments(s.comments))
[{'author': 'wheremydirigiblesat',
  'id': u'ctuzo4x',
  'replies': [[{'author': 'rhascal',
                'id': u'ctvd6jw',
                'replies': [[{'author': 'xeltius', 'id': u'ctvx1vq'}]]}]]},
 {'author': 'DemiDualism',
  'id': u'ctv54qs',
  'replies': [[{'author': 'rhascal',
                'id': u'ctv5pm1',
                'replies': [[{'author': 'blakeb43', 'id': u'ctvdb9c'}]]}]]},
 {'author': 'Final7C', 'id': u'ctvao9j'}]

Submissionオブジェクトには、オブジェクトのリストである属性commentsがありCommentます。各Commentオブジェクトには、より多くの の_repliesリストである属性がありますComment

私は何が欠けていますか?私は最善を尽くしました - 再帰は難しいです。

4

1 に答える 1

2

ほぼ正解です。問題は、単純な再帰を複雑なものにしようとしているということです。既にコメントを繰り返し処理しているため、内部の関数tail()だけでなく関数も必要ありません。map()

コメントを実際に辞書に変換するため、例で関数の名前を変更しました。

単純なケースから始めましょう。次のように考えてみましょう。「わかりました。コメントのリストを辞書のリストに変換できる関数が必要です」。シンプルな機能:

def comments_to_dicts(comments):
    results = []  # create list for results
    for comment in comments:  # iterate over comments
        item = {
            "id": comment.id,
            "author": comment.author,
        }  # create dict from comment

        results.append(item)  # add converted item to results 
    return results  # return all converted comments

そして、dict に変換された返信のリストも dict に含めたいとします。そして、この変換を行うことができる関数が既にあるので、それを使用して結果を に入れましょうitem['replies']:

def comments_to_dicts(comments):
    results = []  # create list for results
    for comment in comments:  # iterate over comments
        item = {
            "id": comment.id,
            "author": comment.author,
        }  # create dict from comment

        if len(comment._replies) > 0:
            item["replies"] = comments_to_dicts(comment._replies)  # convert replies using the same function

        results.append(item)  # add converted item to results 
    return results  # return all converted comments

呼び出した同じ関数を変更したため、返信の深さに関係なく、すべての返信が変換されます。再帰がどのように機能するかがより明確になることを願っています。

于 2015-08-08T22:16:37.460 に答える