You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化双列表匹配索引对应值相乘的执行性能?

高效实现列表匹配更新方案

问题背景

我创建了两个列表a和b,列表a长度为24480,列表b长度为20116。两个列表的每个元素都是长度为3的子列表,结构如下:

# 子列表结构示例
a_item = [str1a, str2a, float1a]
b_item = [str1b, str2b, float1b]

需求:当子列表的str1a == str1b且str2a == str2b时,将a中对应子列表的float1a更新为float1a * float1b。注意列表b存在重复元素,且a中并非所有元素都能找到匹配项。

当前使用嵌套循环实现,但效率较低,代码如下:

for i in range(0, len(a)):
    for n in range(0, len(b)):
        if a[i][0] == b[n][0] and a[i][1] == b[n][1]:
            a[i][2] *= b[n][2]

优化方案

嵌套循环的时间复杂度为O(M*N),对于数万条数据来说效率极低。我们可以利用Python原生字典的O(1)查找特性,将时间复杂度降至O(M+N),具体步骤如下:

1. 预处理列表b,合并相同键的乘积

由于b中存在重复的(str1b, str2b)组合,我们先将这些组合对应的float1b相乘,存入字典中,确保每个键只对应一个最终乘积值:

# 构建b的乘积字典
b_product_dict = {}
for s1, s2, val in b:
    key = (s1, s2)
    if key in b_product_dict:
        b_product_dict[key] *= val
    else:
        b_product_dict[key] = val

2. 遍历列表a完成更新

遍历a中的每个元素,用(str1a, str2a)作为键去字典中查找,找到匹配项则更新float1a:

# 更新a中的对应元素
for item in a:
    key = (item[0], item[1])
    if key in b_product_dict:
        item[2] *= b_product_dict[key]

方案优势

  • 时间效率大幅提升:从原来的二次方复杂度降至线性复杂度,处理数万条数据时速度差距会非常明显
  • 完全使用Python原生语法,无需导入任何外部模块
  • 逻辑和原嵌套循环完全一致:合并乘积的操作等价于原循环中多次匹配相乘的效果(乘法结合律)

内容的提问来源于stack exchange,提问作者joetjen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:26:14