Пушыстый (_winnie) wrote,
Пушыстый
_winnie

Category:

Python: временные переменные в list comprehension

Читая исходники питоновского (имп)экспортера в Blender, наткнулся на забавный синтаксический трюк.

Иногда жалко, что в list comprehension нельзя завести временную переменную, как where в Haskell, и надо либо что-то вычислять два раза, забивая на производительность, либо разделить на два последовательных list comprehension (или пара вложеных)

Пример:
[f(x) for x in l if g(f(x))]
или
[(f(x), g(f(x))) for x in l]

Внутри f - может быть скажем открытие и закрытие файла, с разбитием на строки.
Тогда можно либо переписать в два приёма:

fxs = [f(x) for x in l]
fxs = [fx for fx in fxs if g(fx)]

либо оказывается можно через задницу завести временную переменную.
[fx for x in l for fx in (f(x),) if g(fx)]
[(fx, g(fx) for x in l for fx in (f(x),)]

(f(x),) - это тюпл из одного элемента
>>> lines = ['', 'a', '    b   ', '', 'c']
>>> lines2 = [ls for l in lines for ls in (l.strip(),) if ls]
>>> lines2
['a', 'b', 'c']


Ни в коем случае не призываю так писать, просто показалось интересным.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 11 comments