列表理解分解,解构和/或反汇编

时间:2014-04-21 14:19:56

标签: python list-comprehension web2py

在web2py中,我一直试图打破这个列表理解,这样我就可以按照它创建的类别做我喜欢的事情。关于这个细分的任何想法?

def menu_rec(items): 
    return [(x.title,None,URL('shop', 'category',args=pretty_url(x.id, x.slug)),menu_rec(x.children)) for x in items or []]

此外还有以下内容:

response.menu = [(SPAN('Catalog', _class='highlighted'), False, '',
             menu_rec(db(db.category).select().as_trees()) )]

到目前为止,我已经提出:

def menu_rec(items):
    for x in items:
        return x.title,None,URL('shop', 'category',args=pretty_url(x.id, x.slug)),menu_rec(x.children))

我有其他的变化但是,每个变体只给我一个(一个)类别,与给我所有类别的原始相比。

任何人都可以看到我搞砸了这个地方吗?感谢所有的帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

列表推导通过附加:

来构建列表
def menu_rec(items): 
    result = []
    for x in items or []:
        url = URL('shop', 'category', args=pretty_url(x.id, x.slug))
        menu = menu_rec(x.children)  # recursive call
        result.append((x.title, None, url, menu))
    return result

我添加了两个局部变量来稍微分解长线,并显示它如何以递归方式调用自身。

您的版本在第一次迭代期间直接从for循环返回,并且从未构建列表。

答案 1 :(得分:0)

你不想做return。而是附加到列表然后返回列表:

def menu_rec(items):
    result = []
    for x in items:
        result.append(x.title,None,URL('shop', 'category',args=pretty_url(x.id, x.slug)),menu_rec(x.children)))
    return result

如果执行return,它将仅在第一次迭代后返回值。相反,继续将其添加到列表中,然后在结尾处返回该列表。这样,只有在全部添加了值后才会返回result列表,而不是只返回一个值。