Python列表理解与Perl中的map/grep是一回事吗?

fri*_*edo 18 python perl list

我在使用Python中的列表理解语法时遇到了一些麻烦,所以我开始考虑如何在Perl中实现相同的功能,我更熟悉它.我意识到基本的例子(取自本页)都可以在Perl中用map或完成grep.

例如

(python)                            (perl)                  
S = [x**2 for x in range(10)]       @S = map { $_**2 } ( 0..9 );
V = [2**i for i in range(13)]       @V = map { 2**$_ } ( 0..12 );
M = [x for x in S if x % 2 == 0]    @M = grep { $_ % 2 == 0 } @S;
Run Code Online (Sandbox Code Playgroud)

那么"列表理解"只是"地图和/或过滤列表"的一个奇特的术语,还是有更多的东西?

Mar*_*off 14

你是对的:列表推导基本上只是地图和过滤器的语法糖(来自函数式编程世界的术语).

希望此示例代码演示它们的相等性:

>>> # Python 2
>>> [x**2 for x in range(10)] == map(lambda x: x**2, range(10))
True
>>> [2**i for i in range(13)] == map(lambda x: 2**x, range(13))
True
>>> S = [x**2 for x in range(10)]
>>> [x for x in S if x % 2 == 0] == filter(lambda x: x % 2 == 0, S)
True
Run Code Online (Sandbox Code Playgroud)

请注意,这仅在Python 2.X中有效,正如SilentGhost在注释中指出的那样.为了使其与Python 3兼容,您必须在list构造函数中包含对map或filter的调用,因为map和filter已更新为返回迭代器而不是列表.

>>> # Python 3
>>> [x**2 for x in range(10)] == list(map(lambda x: x**2, range(10)))
True
>>> [2**i for i in range(13)] == list(map(lambda x: 2**x, range(13)))
True
>>> S = [x**2 for x in range(10)]
>>> [x for x in S if x % 2 == 0] == list(filter(lambda x: x % 2 == 0, S))
True
Run Code Online (Sandbox Code Playgroud)