【问题标题】:Do a function call in a list comprehension only once if needed twice [duplicate]如果需要两次,则仅在列表理解中执行一次函数调用[重复]
【发布时间】:2017-04-27 23:29:46
【问题描述】:

这是一个关于生成器/列表理解的通用 Python 问题。

对于给定的可迭代 x,我需要一个如下所示的列表理解:

[ flatten(e) for e in x if flatten(e) != '' ]

函数flatten 可能很昂贵,所以最好只调用一次。有没有办法在富有表现力的单行中做到这一点?

【问题讨论】:

  • @selcuk Mmmh,不确定这两个问题是否足以共享 duplicate 标志...“局部变量”问题的答案确实有助于解决这个问题,但是这里提供的答案的简洁性是“局部变量”问题的答案所无法比拟的。
  • 我不同意,因为即使这里接受的答案与副本几乎相同。

标签: python generator list-comprehension


【解决方案1】:

嵌套一个生成器:

[item for item in (flatten(e) for e in x) if item != '']

或者:

[item for item in map(flatten, x) if item != '']

【讨论】:

    【解决方案2】:

    不是真的...一般来说,我建议分两步执行此操作。第一步扁平化,第二步过滤:

    flattened = (flatten(e) for e in x)
    [f for f in flattened if f]
    

    您可以将生成器放入 list-comp,但我发现这样做往往会损害可读性而收效甚微(恕我直言)。

    也可以写:

    list(filter(None, map(flatten, e)))
    

    但我不认为这更好:-)

    【讨论】:

    • 我非常喜欢这个答案!即使这个问题是针对单行的,但将其分成两行使其更具可读性恕我直言。
    【解决方案3】:

    使用map 函数。

    [ e for e in map(flatten, x) if e != '' ]
    

    【讨论】:

    • nit:不必要的 lambda...map(flatten, x) 是一回事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2012-01-21
    相关资源
    最近更新 更多