0

私がやろうとしているのは、コメントのリストを繰り返し処理し、 という値に追加された現在のコメントを削除し、9000 文字を超えたcText場合は同じ関数を再帰的に呼び出し、その戻り値を に追加することです。また、再帰関数から返されたリストを一番上のリストにマージしようとしていますが、正しいことをしているかどうかはわかりません。奇妙なことに、以下に貼り付けた例外をスローするコメントが確実にあるリスト内のコメントが見つからないようです。私は AP Comp-Sci の授業中に再帰がひどかったのですが、以下のコードの混乱を修正できる人から、私が間違っていることを学びたいと思っています。ありがとう :)cTextbotCommentsbotCommentsbotCommentsbotComments + repliesToComments(comments, author)

これが私の現在の例外です:

Traceback (most recent call last):
  File "C:\Users\Josh\Desktop\bot.py", line 62, in <module>
    print(repliesToComments(submission.comments, submission.author.name))
  File "C:\Users\Josh\Desktop\bot.py", line 36, in repliesToComments
    botComments + repliesToComments(comments, author)
  File "C:\Users\Josh\Desktop\bot.py", line 39, in repliesToComments
    comments.remove(comment)
ValueError: list.remove(x): x not in list

これが私のコードです:

def repliesToComments(comments, author):
    botComments = []
    multiReplies = False

    cText = "Here is a list of all the comments /u/" + author + ''' has submitted to top-level comments:
***
Original Comment | /u/''' + author + ''''s Reply
---------|---------
'''

    for comment in comments[:]:
        if (hasattr(comment, "replies")):
            for comment2 in comment.replies:
                if (hasattr(comment2, "author") and comment2.author.name == author):
                    oCommentLink = "[" + comment.body.replace("\n", "")[:50] + "](" + submission.permalink + "" + comment2.parent_id.replace("t1_", "") + ")..."
                    rCommentLink = "[" + comment2.body.replace("\n", "")[:50] + "](" + submission.permalink + "" + comment2.name.replace("t1_", "") + ")..."
                    if (len(cText) + len(oCommentLink + " | " + rCommentLink + "\n") > 9000): #Stop here to make sure we don't go over 10000 char limit!
                        multiReplies = True
                        cText += '''
***
[FAQ](http://pastebin.com/raw.php?i=wUGmE8X5) | Generated at ''' + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " PST" + " | *This comment only shows a partial amount of OPs total replies due to character limit. The rest are shown in a reply to this comment.*"
                        botComments.append(cText)
                        botComments + repliesToComments(comments, author)
                        break
                    cText += oCommentLink + " | " + rCommentLink + "\n"
        comments.remove(comment)

    if (multiReplies == False):
        cText += '''
***
[FAQ](http://pastebin.com/raw.php?i=wUGmE8X5) | Generated at ''' + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " PST"

    botComments.append(cText)
    return botComments
4

1 に答える 1

4

repliesToComments()再帰的に呼び出していますが、まったく同じ引数を使用しています。これは問題を引き起こすだけです。

あなたの再帰呼び出しは同じリストからエントリを削除しています.それが戻ったとき、それらのエントリはまだ消えています. ただし、リストのコピーをループするため、外側の呼び出しは更新されず、内側の再帰呼び出しが既に削除されているコメントを削除しようとします。

おそらくrepliesToComments()、再帰するときに別のコメントのセットを呼び出したかったのでしょうか? comment.replies代わりにそれを呼び出すつもりだったと思いますか?

コードのもう 1 つの問題は、再帰呼び出しの戻り値を無視することです。

botComments + repliesToComments(comments, author)

これにより、リストbotCommentsと再帰呼び出しの戻り値が追加され、新しいリストが作成されます。これを変数に割り当てずにフロアにドロップします。おそらく使用したいでしょう:

botComments += repliesToComments(comments, author)

代わりは。

于 2013-10-21T00:17:07.650 に答える