属性を持つコメントのリストがあります: pk
(主キー)、parent_pk
(親の主キー) など... ネストを考慮して表示したい — コメントに子がある場合は、コメントを表示し、次にインデントされた子を表示する. コメントが他のコメントpk
と同じである場合、コメントは他のコメントの子ですparent_pk
。
本来は Django ブログで実装する予定ですが、まずはハウツーを学びたいと思います。そのため、簡単にするために、CLI アプリを作成しました。すぐに使えるソリューションがあることは知っていますが、自分でそれを行う方法を学びたいと思っています。:)
これは今のところ私のコードです:
class Comment(object):
def __init__(self, pk, parent_pk, content):
self.pk = pk
self.parent_pk = parent_pk
self.content = content
def has_children(self, comments):
for comment in comments:
if self.pk == comment.parent_pk:
return True
return False
def get_children(self, comments):
children = []
for comment in comments:
if self.pk == comment.parent_pk:
children.append(comment)
return children
def print_nested(comments, level=0):
def to_whitespaces(level):
if level == 0:
return ""
else:
return " " * (level * 2)
for comment in comments:
print to_whitespaces(level) + comment.content
if comment.has_children(comments):
print_nested(comment.get_children(comments), level + 1)
comments.pop(0)
comments = [
Comment(1, None, "foo"),
Comment(2, 1, "foo bar"),
Comment(3, None, "spam"),
Comment(4, 3, "spam cheese"),
Comment(5, 4, "spam cheese monty"),
Comment(6, None, "muse"),
]
print_nested(comments)
期待される結果:
foo
foo bar
spam
spam cheese
spam cheese monty
muse
実結果:
foo
foo bar
spam
spam cheese
spam cheese monty
muse
ご覧のとおり、spam cheese monty
まったくインデントされていません。それはなぜですか?どのように実装しますか?ありがとう!