Python list-comprehensions中的lisp风格的`let`语法

Rei*_*ica 6 lisp python refactoring

请考虑以下代码:

>>> colprint([
        (name, versions[name][0].summary or '')
        for name in sorted(versions.keys())
    ])
Run Code Online (Sandbox Code Playgroud)

这段代码的作用是以字典versions的升序打印字典的元素keys,但由于它value是另一个排序列表,因此只打印其第一个元素的摘要("max").

由于我熟悉letlisp,我将上述内容重写为:

>>> colprint([
        (name, package.summary or '')
        for name in sorted(versions.keys())
        for package in [versions[name][0]]
    )]
Run Code Online (Sandbox Code Playgroud)

你认为这违反了Pythonic吗?可以改进吗?

注意:对于好奇,这里colprint定义.

Tor*_*dek 7

为什么不利用元组?

colprint([(name, version[0].summary or '')
      for (name, version) in sorted(versions.iteritems())])
Run Code Online (Sandbox Code Playgroud)

甚至

colprint(sorted([(name, version[0].summary or '')
             for (name, version) in versions.iteritems()]))
Run Code Online (Sandbox Code Playgroud)

此外,您可以考虑(在我的第一个示例中)删除[]s,因为这样您获得生成器而不是列表(可能有用也可能没用,因为我猜这将打印整个数组,所以你不会保存任何评估).


Ale*_*lli 5

在大多数情况下,我不会使用"棘手的条款"(或"let-equivalent"),但如果这是避免重复的自然方式,尤其是代价高昂的重复,我会这样做.例如

xs = [(y, y*1.2, y-3.4) for z in zs for y in [somefun(z)] ]
Run Code Online (Sandbox Code Playgroud)

对我来说看起来比打somefun三次更好! - )所以,值得记住,即使可能不值得使用它不会消除重复.