【发布时间】:2017-02-08 05:33:29
【问题描述】:
我有一个模型页面,它存储一个可选的父页面(它自己的实例)。在我看来,我创建了一个函数,它将返回所有页面及其父页面的嵌套列表。
比如我的页面架构是
CCC
AAA
DDD
KKK
EEE
ZZZ
BBB
所以 DDD 有父页面 AAA,它有自己的父页面 CCC。 CCC 是首页,没有父页面。
该函数将首先获取所有页面实例的查询集并按字母顺序对它们进行排序。然后它将继续递归地生成一个“完整的父架构”列表,其中该列表上的每个元素都是所有父页面的另一个列表,包括页面本身。从上面的示例中,如果我们为页面 DDD 获取一个列表切片,它将返回 [CCC, AAA, DDD]。
对于上述示例,我的函数当前返回这样的列表:
[
[CCC, AAA],
[ZZZ, BBB],
[CCC],
[CCC, AAA, DDD],
[CCC, AAA, KKK, EEE],
[CCC, AAA, KKK],
[ZZZ],
]
从该列表中可以看出,所有元素都根据该列表中的最后一个元素按字母顺序排序。现在我想在我的前端显示所有这些父页面,基本上看起来像一个站点地图,并显示我网站上所有页面的正确父架构,这些页面根据每个嵌套列表中的每个元素按字母顺序排序。最终结果是:
[
[CCC],
[CCC, AAA],
[CCC, AAA, DDD],
[CCC, AAA, KKK],
[CCC, AAA, KKK, EEE],
[ZZZ],
[ZZZ, BBB],
]
简单地说,我想遍历每个列表中的每个第一个元素并按字母顺序对其进行排序,然后是每个第二个元素并对其进行排序,然后是第三个,然后是第四个,依此类推。有没有办法做到这一点?
编辑: 为避免混淆,这是我的观点:
def page_list(request):
# Fetch all pages and sort them alphabetically
queryset = Page.objects.all().order_by("title")
output = []
# Generate list of pages and their parents
for page in queryset:
output.append(get_list_of_parents(page))
context = {
"title": "Page List",
"page_list": output,
}
return render(request, template + '/page_list.html', context)
# Get an array of all parent instances of a Page model
def get_list_of_parents(page, list=None):
current_page = page
parent_list = []
if list is not None:
parent_list = list
parent_list.append(current_page)
if current_page.parent is not None:
parent_list = get_list_of_parents(current_page.parent, parent_list)
else:
# if this is the last parent page, reverse the order of list to display list in form of parent path to child
parent_list.reverse()
return parent_list
【问题讨论】:
-
最终结果是否有错误?你的意思是:
[CCC, AAA, DDD], [CCC, AAA, KKK], [CCC, AAA, KKK, EEE],? -
使用深度优先搜索算法遍历你的树,将每一步存储在一个列表中。
-
您是在问如何按字母顺序对列表的子列表进行排序?
-
@LaurentLAPORTE 是的,这是一个错字,我会在一秒钟内编辑
-
@Mr.goosberry 不,每个嵌套列表都已正确排序。对于这些列表中的每一个,最后一个元素是最后一个子元素,所有之前的元素都是父元素,因此对于页面 DDD,它显示 [parentOfParenOfDDD, parentOfDDD, DDD]
标签: python django sorting nested-lists