首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python 3中使用过滤器、映射和归约

如何在Python 3中使用过滤器、映射和归约
EN

Stack Overflow用户
提问于 2012-11-30 12:12:53
回答 3查看 316.1K关注 0票数 345

filtermapreduce在Python2中可以完美地工作。下面是一个例子:

代码语言:javascript
复制
>>> def f(x):
        return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

>>> def cube(x):
        return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

>>> def add(x,y):
        return x+y
>>> reduce(add, range(1, 11))
55

但在Python 3中,我收到以下输出:

代码语言:javascript
复制
>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>

>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>

>>> reduce(add, range(1, 11))
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    reduce(add, range(1, 11))
NameError: name 'reduce' is not defined

如果有人能给我解释一下为什么会这样,我将不胜感激。

为了更清晰起见,代码截图如下:

EN

回答 3

Stack Overflow用户

发布于 2016-08-31 12:00:40

作为对其他答案的补充,这听起来像是上下文管理器的一个很好的用例,它将把这些函数的名称重新映射到返回列表并在全局名称空间中引入reduce的函数。

快速实现可能如下所示:

代码语言:javascript
复制
from contextlib import contextmanager    

@contextmanager
def noiters(*funcs):
    if not funcs: 
        funcs = [map, filter, zip] # etc
    from functools import reduce
    globals()[reduce.__name__] = reduce
    for func in funcs:
        globals()[func.__name__] = lambda *ar, func = func, **kwar: list(func(*ar, **kwar))
    try:
        yield
    finally:
        del globals()[reduce.__name__]
        for func in funcs: globals()[func.__name__] = func

其用法如下所示:

代码语言:javascript
复制
with noiters(map):
    from operator import add
    print(reduce(add, range(1, 20)))
    print(map(int, ['1', '2']))

打印的内容:

代码语言:javascript
复制
190
[1, 2]

我只想说两点:-)

票数 12
EN

Stack Overflow用户

发布于 2018-06-25 10:20:25

因为已经从Python3的内置函数中删除了reduce方法,所以不要忘记在代码中导入functools。请看下面的代码片段。

代码语言:javascript
复制
import functools
my_list = [10,15,20,25,35]
sum_numbers = functools.reduce(lambda x ,y : x+y , my_list)
print(sum_numbers)
票数 8
EN

Stack Overflow用户

发布于 2020-09-23 00:28:50

代码语言:javascript
复制
from functools import reduce

def f(x):
    return x % 2 != 0 and x % 3 != 0

print(*filter(f, range(2, 25)))
#[5, 7, 11, 13, 17, 19, 23]

def cube(x):
    return x**3
print(*map(cube, range(1, 11)))
#[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

def add(x,y):
    return x+y

reduce(add, range(1, 11))
#55

它是按原样工作的。要获得map的输出,请使用*或list

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13638898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档