Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用pythonical方法整理列表理解_Python - Fatal编程技术网

用pythonical方法整理列表理解

用pythonical方法整理列表理解,python,Python,类似于FP的Haskell可以简单地绑定(var)名称,例如: [(g y, h y) | x <- mylist, let y = f x] Python 3.8中的Walrus赋值似乎是对以下内容的攻击: 到目前为止,在这种情况下,什么是python方式?我认为map更适合于对列表的每个元素应用操作 mylist = map(f, mylist) mylist = list(map(lambda x: (g(x), g(x)), mylist)) 正确使用walrus操作符创建2元

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

[(g y, h y) | x <- mylist, let y = f x]
Python 3.8中的Walrus赋值似乎是对以下内容的攻击:


到目前为止,在这种情况下,什么是python方式?

我认为
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)]
我不会说walrus操作符总是那么笨拙,但它似乎比这里值得的麻烦多了。

因为Python没有,最干净的方法就是编写一个函数并调用它

def应用(x):
y=f(x)
返回g(y),h(y)
mylist=[对mylist中的x应用_g_h(x)]
如果您真的喜欢将其作为一个线性函数,那么lambda函数可以达到相同的目的:

mylist=[(lambda y:(g(y),h(y)))(f(x))表示mylist中的x]

这是因为e2中的“let”表达式
let x=e1
相当于
(lambda x:e2)(e1)
。当我仅限于编写表达式(传递给
eval
)时,我有时不得不这样做,但可读性不强,因此我认为第一种解决方案要好得多。

如果他们在python 3.8中添加它,这一定是pythonic。很明显,在治理之后,它很受欢迎,最终成为了该语言——在我看来,这就是现在的发展方向。如果没有这个操作符,您必须调用
f(x)
3次。不确定它是否是pythonic,但性能会受到影响。@modesit不确定,因为Guido不再是它上面的BDFL。让它成为语言,这是基于观点的。守则有效;它应该是封闭的,Guido想抛弃
map
,所以我不确定这是否是一个明确的“pythonic”,Guido也想抛弃
lambda
;他一般不喜欢函数技术(从
reduce
的内置模块降级为
functools
模块可以看出),但列表理解是一种函数技术@kaya3很讽刺,不是吗?:)但即使是在Haskell(Python借用它的地方),它也是用来隐藏函数应用程序的语法糖!在这三个选项中,我强烈推荐第三个。第一个选项对我来说似乎更灵活,但在外部范围引入了新的变量,甚至是不需要的。第三个仍然需要在别处定义
f
。第三个不需要,因为
map
在您实际向它请求项目之前不会做任何事情。将
map
想象为在
mylist
周围应用包装器;每次您请求一个项目时,它都会首先通过
f
map(f,xs)
本质上与
(f(x)for x in xs)
相同。立即调用lambda表达式的第二个选项对我来说也很好!
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)]