代码之家  ›  专栏  ›  技术社区  ›  Albert

python:复杂的列表理解,其中一个var依赖于另一个var(x代表t中的x[1]代表t在测试中的t)

  •  7
  • Albert  · 技术社区  · 16 年前

    我想做如下的事情:

    all = [ x for x in t[1] for t in tests ]
    

    测试如下:

    [ ("foo",[a,b,c]), ("bar",[d,e,f]) ]
    

    所以我想要结果

    all = [a,b,c,d,e,f]
    

    我的代码不起作用,python说:

    UnboundLocalError: local variable 't' referenced before assignment
    

    有什么简单的方法可以做到吗?

    4 回复  |  直到 10 年前
        1
  •  16
  •   Ferdinand Beyer    16 年前

    它应该反过来工作:

    all = [x for t in tests for x in t[1]]
    
        2
  •  5
  •   Michael Dillon    16 年前

    当有疑问时,不要使用列表理解。

    尝试 import this 在python shell中读取第二行:

    Explicit is better than implicit
    

    这种对列表理解的复合将使许多Python程序员感到困惑,因此至少添加一条注释来解释您正在删除字符串并扁平剩余的列表。

    一定要使用清单理解,它们清晰易懂,特别是当它们是惯用的时候,尤其要使用它们,也就是说,通常使用它们是因为它们是最有效或最优雅的表达方式。例如, this Python Idioms article 给出以下示例:

    result = [3*d.Count for d in data if d.Count > 4]
    

    它清晰、简单、直截了当。如果您注意格式,并且可能添加注释,嵌套列表的理解也不错,因为大括号有助于读者分解表达式。但在我看来,这个问题的解决方案过于复杂和混乱。它越界,使太多人无法阅读代码。最好将至少一个迭代展开为for循环。

        3
  •  2
  •   PaulMcG    16 年前

    如果您所要做的只是将一些列表添加到一起,请尝试使用内置的和,并使用[]作为起始值:

    all = sum((t[1] for t in tests), [])
    
        4
  •  1
  •   Gurgeh    16 年前

    这对我来说好像是减少了。不幸的是,python没有为reduce提供任何语法糖分,因此我们必须使用lambda:

    reduce(lambda x, y: x+y[1], tests, [])