Python中按函数输出匹配两个列表元素的更优实现方法咨询
优化方案
你当前使用itertools.product的实现时间复杂度为O(len(l1)*len(l2)),在两个列表长度较大时性能会非常差,因为要遍历所有元素的两两组合。
由于你明确说明f1和f2均为单射函数,完全可以通过字典预映射的方式把时间复杂度降到O(len(l1)+len(l2)),不需要引入任何第三方依赖,代码也更简洁:
# 优先为长度更小的列表构建映射,节省空间,这里以先处理l2为例 f2_to_e2 = {f2(e2): e2 for e2 in l2} # 遍历l1直接匹配结果 tuples_list = [(e1, f2_to_e2[f1(e1)]) for e1 in l1 if f1(e1) in f2_to_e2]
如果l1长度小于l2,可以反过来为l1构建映射,进一步优化空间占用:
f1_to_e1 = {f1(e1): e1 for e1 in l1} tuples_list = [(f1_to_e1[f2(e2)], e2) for e2 in l2 if f2(e2) in f1_to_e1]
补充说明
- 单射的特性保证了同一个函数返回值只会对应唯一的元素,不会出现字典key冲突的问题,上述写法完全适配你的使用场景。
- Python标准库没有专门封装该逻辑的内置函数,因为字典推导+列表推导的组合已经足够简洁高效,没有额外封装的必要。
- 如果后续需要适配非单射场景(一个返回值对应多个元素),只需要把字典值改为列表存储所有对应元素,遍历的时候展开即可。
内容的提问来源于stack exchange,提问作者Sagi Buchbinder Shadur
相关产品推荐
相关产品推荐

