如何使用Lambda单行表达式或类似方式精简Python代码?——字符串查询计数函数的简化实现
提问
出于好奇,我希望获取与以下函数功能完全一致但代码行数尽可能少的实现方案。该函数接收strings字符串列表与queries查询列表两个参数,统计每个查询字符串在strings列表中的出现次数,并将所有统计结果组成新列表返回。
原函数代码如下:
def matchingStrings(strings, queries): results = [] for i in range(len(queries)): temp_list = queries[i] results.append(strings.count(temp_list)) return results
输入示例:
strings = ["aaa", "abc", "zzz", "xyz", "asd", "aaa"] queries = ["aa", "aaa", "xyz"]
输出示例:[0, 2, 1]
同时咨询如何通过Lambda单行写法或类似方法实现Python代码的行数精简。
回答
嘿,刚好能帮到你!咱们来一步步把代码精简到极致,同时保证功能完全一致:
1. 最简单行实现(和原逻辑完全匹配)
原函数的核心逻辑就是遍历每个查询,统计它在strings里的出现次数,用列表推导式直接就能把整个函数压缩成一行:
def matchingStrings(strings, queries): return [strings.count(q) for q in queries]
如果非要用lambda的话,直接把这个逻辑包进去就行,完全可以写成单行匿名函数:
matchingStrings = lambda strings, queries: [strings.count(q) for q in queries]
测试一下你的示例:
strings = ["aaa", "abc", "zzz", "xyz", "asd", "aaa"] queries = ["aa", "aaa", "xyz"] print(matchingStrings(strings, queries)) # 输出 [0, 2, 1]
和原函数结果完全一致,而且行数直接砍到了1行(如果算lambda的话)。
2. 性能升级的单行写法(适合大数据量)
不过有个小问题:原函数每次调用strings.count(q)都会把整个strings列表遍历一遍,如果strings特别长或者查询很多,效率会很低。咱们可以先用collections.Counter把strings的频率统计好,再查字典,这种写法也能做成单行:
from collections import Counter matchingStrings = lambda strings, queries: [Counter(strings).get(q, 0) for q in queries]
这样只需要遍历一次strings,之后每个查询都是O(1)的速度,比原方法高效多了,结果也完全一样。
3. 关于Lambda单行写法的小提示
Lambda本身就是为了写简短的匿名函数存在的,结合列表推导式刚好适配这种“遍历+简单操作”的场景。不过要注意:
- 别为了单行硬塞复杂逻辑,可读性还是很重要的
- 如果需要用到像Counter这种工具,优先在外部导入,别把导入逻辑塞到Lambda里(虽然技术上能实现,但可读性极差)
内容的提问来源于stack exchange,提问作者justwannalearn




