如何不使用for循环统计元组列表中每组元组内第一个列表元素在第二个列表中的匹配数量
如何不使用for循环统计元组列表中每组元组内第一个列表元素在第二个列表中的匹配数量
嘿,这个需求我之前也碰到过!不用写显式的for循环的话,咱们可以用Python的内置函数结合集合操作来高效解决,代码简洁还符合你的要求。
核心思路
利用集合的交集特性快速找出两个列表的共同元素,再通过map函数批量处理每个元组,完全避免显式的循环语句。
基础解决方案(适用于无重复元素的场景)
针对你给出的示例数据,第一个列表里没有重复元素,用下面的代码就可以直接得到结果:
names = [ ([''], ['aa']), (['aa', 'bb'], ['aa']), (['cc'], ['cc', 'dd', 'yy']), (['xx', 'ss'], ['xx', 'ss']), ] # 用map结合lambda处理每个元组,集合交集的长度就是匹配数 result = list(map(lambda t: len(set(t[0]) & set(t[1])), names)) print(result) # 输出: [0, 1, 1, 2]
代码解释:
set(t[0])和set(t[1]):把两个列表转成集合,自动去重(你的示例里没重复,不影响结果)set(t[0]) & set(t[1]):求两个集合的交集,也就是同时存在于两个列表里的元素len(...):获取交集的元素个数,就是你要统计的匹配数量map(...):遍历names里的每个元组,批量执行上面的逻辑list(...):把map返回的迭代器转成列表,得到最终结果
进阶方案(支持第一个列表有重复元素的场景)
如果你的实际数据里,第一个列表可能存在重复元素(比如(['aa','aa'],['aa'])),需要统计实际出现的次数总和,那可以结合collections.Counter来实现:
from collections import Counter names_with_duplicates = [ (['aa','aa'], ['aa']), (['bb','cc','bb'], ['bb','dd']) ] result = list(map(lambda t: sum(min(cnt, t[1].count(item)) for item, cnt in Counter(t[0]).items()), names_with_duplicates)) print(result) # 输出: [2, 2]
这个方案会统计第一个列表中每个元素在第二个列表里的出现次数,取两者的最小值再求和,完全贴合重复元素的统计需求。
备注:内容来源于stack exchange,提问作者corianne1234
相关产品推荐
相关产品推荐

