整理列表理解pythonically

2024-03-28 19:19:36 发布

您现在位置:Python中文网/ 问答频道 /正文

类似于FP的Haskell可以简单地绑定(var)名称,例如:

[(g y, h y) | x <- mylist, let y = f x]

Python可能做到了以下几点:

mylist = [f(x) for x in mylist]
mylist = [(g(y), h(y)) for y in mylist]

python3.8中的Walrus赋值似乎是对simplify list comprehensions的攻击:

[(y := f(x), g(y), h(y)) for x in mylist]

到目前为止,在这种情况下,什么是被认为是Python的方式?你知道吗


Tags: in名称forhaskellvar方式情况simplify
3条回答

我认为map更适合于对列表的每个元素应用操作。你知道吗

mylist = map(f, mylist)
mylist = list(map(lambda x: (g(x), g(x)), mylist))

正确使用walrus操作符来创建2元组

mylist = [(g(y:=f(x)), h(y)) for x in mylist]

是的,这比三元组版本更可怕。如果您想放弃walrus操作符,请使用:=应该避免的版本:

mylist = [(g(y), h(y)) for x in mylist for y in [f(x)]]

或者更简单

mylist = [(g(y), h(y)) for y in map(f, mylist)]

我不会说海象操作员总是那么笨拙,但这似乎比它在这里的价值更麻烦。你知道吗

由于Python没有"let ... in ..." expressions,最简洁的方法就是编写函数并调用它。你知道吗

def apply_g_h(x):
    y = f(x)
    return g(y), h(y)

mylist = [ apply_g_h(x) for x in mylist ]

如果您真的喜欢将其作为一个线性函数,那么lambda函数可以达到相同的目的:

mylist = [ (lambda y: (g(y), h(y)))(f(x)) for x in mylist ]

这是因为“let”表达式let x = e1 in e2等价于(lambda x: e2)(e1)。当我仅限于编写表达式(传递给eval)时,我有时不得不这样做,但它的可读性不强,所以我认为第一种解决方案更好。你知道吗

相关问题 更多 >