使用filter与Lambda实现回文判断:plnd函数正常但plnd_v函数异常的原因咨询
为什么plnd函数能正确判断回文,而plnd_v不行?
嘿,这问题的核心原因其实很简单——map和filter返回的是「迭代器(iterator)」,而迭代器只能被遍历一次!我给你一步步拆解:
先看正常工作的plnd函数
你在plnd里做了两次完全独立的处理流程:
- 第一次:创建
filtered_rev(过滤后的迭代器)→lower_rev(转小写的迭代器)→ 转成字符串后反转得到rev - 第二次:重新创建
filtered(新的过滤迭代器)→lower(新的转小写迭代器)→ 转成字符串得到reg
这里的关键是,filtered_rev和filtered是两个完全不同的迭代器,lower_rev和lower也是独立的。所以两次调用''.join()时,都是从全新的迭代器里读取所有元素,最终rev和reg都是处理后的完整字符串(比如你的测试用例处理后是amanaplanacanalpanama),反转后和原字符串相等,自然能正确判断回文。
再看出问题的plnd_v函数
plnd_v里犯了一个典型的迭代器陷阱:
filtered = filter(lambda x: x.isalnum(),sen) lower = map(lambda x: x.lower(), filtered) rev = ''.join(lower)[::-1] # 第一次遍历lower迭代器,把所有元素都取完了 reg = ''.join(lower) # 第二次遍历,迭代器已经空了,得到空字符串''
当你第一次调用''.join(lower)时,已经把lower这个迭代器里的所有元素都读取完毕了,迭代器内部的指针已经走到了末尾。这时候再调用''.join(lower),迭代器里已经没有任何元素可以返回了,所以reg变成了空字符串''。
你的测试用例处理后的字符串是amanaplanacanalpanama,反转后还是它本身,但rev是这个字符串,reg是空字符串,两者当然不相等,所以函数错误地输出了“Not a palindrome”。
如何修正plnd_v?
解决方法很简单,把迭代器转换成可重复遍历的容器(比如列表),这样就能多次读取了:
def plnd_v(a): filtered = filter(lambda x: x.isalnum(),sen) lower = list(map(lambda x: x.lower(), filtered)) # 转成列表 rev = ''.join(lower)[::-1] reg = ''.join(lower) # 现在可以重复读取列表里的元素 if rev == reg: print(f"'{sen}' is a Palindrome! ") else: print("Not a palindrome")
这样lower是一个列表,而不是迭代器,两次join都能读取到完整的内容,就能正确判断回文了。
内容的提问来源于stack exchange,提问作者Lena Meer
相关产品推荐
相关产品推荐

