Python 中的 map() 和 filter() 方法详解

这两个都是 Python 的内置高阶函数(接受函数作为参数),用于处理可迭代对象(如列表、元组等),但功能不同:

1. map() 函数

作用:对可迭代对象中的每个元素应用指定函数,返回处理后的新迭代器。

语法:

map(function, iterable)

特点:

不会修改原数据,返回新迭代器

需要转换为列表/元组才能查看结果(Python 3 中返回迭代器)

函数参数可以是内置函数、lambda 或自定义函数

示例:

# 将列表元素转为平方
nums = [1, 2, 3, 4]
squared = map(lambda x: x**2, nums)
print(list(squared))  # 输出: [1, 4, 9, 16]

# 转换数据类型
str_nums = ["5", "10", "15"]
int_nums = map(int, str_nums)
print(list(int_nums))  # 输出: [5, 10, 15]

# 多个可迭代对象(并行处理)
a = [1, 2, 3]
b = [10, 20, 30]
sums = map(lambda x,y: x+y, a, b)
print(list(sums))  # 输出: [11, 22, 33]

2. filter() 函数

作用:筛选可迭代对象中满足条件的元素,返回新迭代器。

语法:

filter(function, iterable)

特点:

函数应返回布尔值(True/False)

保留使函数返回 True 的元素

函数参数为 None 时,过滤掉 “假值”(False, 0, “”, None 等)

示例:

# 筛选偶数
nums = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, nums)
print(list(evens))  # 输出: [2, 4, 6]

# 过滤空字符串
words = ["hello", "", "world", None, " "]
valid_words = filter(None, words)
print(list(valid_words))  # 输出: ['hello', 'world', ' ']

# 自定义筛选函数
def is_positive(n):
    return n > 0

mixed = [-5, 0, 3, -2, 8]
positives = filter(is_positive, mixed)
print(list(positives))  # 输出: [3, 8]

关键区别对比

特性map()filter()
目的转换所有元素筛选符合条件的元素
返回值与输入长度相同的迭代器长度 ≤ 原数据的迭代器
函数要求可返回任意类型必须返回布尔值
典型用途类型转换、数学运算、格式处理数据清洗、条件筛选、去重

结合使用示例

# 先筛选再转换
data = [1, "a", 2, "b", 3.5, None]

# 步骤1: 过滤出整数
integers = filter(lambda x: isinstance(x, int), data)

# 步骤2: 转换为字符串
result = map(str, integers)

print(list(result))  # 输出: ['1', '2']

现代替代方案:列表推导式

虽然 map() 和 filter() 很有用,但列表推导式通常更易读:

# 等效于 map()
squared = [x**2 for x in nums]

# 等效于 filter()
evens = [x for x in nums if x % 2 == 0]

# 组合使用
combined = [str(x) for x in data if isinstance(x, int)]

建议:

简单操作使用列表推导式

复杂逻辑或已有函数时使用 map()/filter()

处理大数据时优先用迭代器(节省内存)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值