Python中lambda与filter筛选列表首字母为s的单词的原理疑问
代码逻辑问题解答
你出现这个困惑的核心是没搞清楚filter()函数的传参逻辑,以及Python字符串的索引特性:
filter(处理函数, 可迭代对象)的运行规则是:遍历可迭代对象的每一个元素,把单个元素依次传给处理函数做判断,只要函数返回True,就把这个元素保留到最终结果里。- 你这段代码中
lambda x: (x[0] == 's')的入参x,每次接收的是seq列表的单个元素,也就是soup/dog/salad这类字符串,不是整个seq列表。 - Python里字符串属于可迭代的序列类型,支持按索引取对应位置的字符,
字符串[0]就代表取该字符串的第一个字符。比如'soup'[0]的返回值就是s,'dog'[0]返回值就是d。
你可以把这段filter写法转换成等价的普通for循环逻辑,理解起来会更直观:
seq = ['soup','dog','salad','cat','great'] result = [] # 这里的x和lambda表达式里的x完全等价,每次取seq的单个字符串元素 for x in seq: # 判断单个字符串的首字母是否为s if x[0] == 's': result.append(x) print(result)
只有你直接对整个seq列表取索引seq[0]的时候,得到的才是列表的第一个元素soup,和这里的x[0]是完全不同的逻辑。
内容的提问来源于stack exchange,提问作者rosa
相关产品推荐
相关产品推荐

