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

如何按股票编号分组计算嵌套列表对应第三元素的乘积?

计算嵌套列表中各股票对应数值的乘积

问题回顾

你现在有一个包含多股票数据的嵌套列表,每个子列表的第一个元素是股票编号,第三个元素是需要计算乘积的数值。现有代码只能处理单股票的情况,需要一个通用方法来处理任意数量、任意数据量的股票。

先把你的示例数据和预期结果再明确下:

示例输入:

A = [[120, 'Date1', 1.03], [120, 'Date2', 1.04], [120, 'Date3', 1.02], [240, 'Date1', 1.06], [240, 'Date2', 0.98], [240, 'Date3', 1.04], [381, 'Date2', 1.03], [381, 'Date3', 0.85]]

预期输出:[1.092624, 1.08035, 0.8755]


方法一:字典分组法(最通用,不受数据顺序影响)

这个方法的核心是先把同一股票的所有数值收集起来,再逐个计算乘积,不管你的股票数据是不是连续排列都能正常工作:

A = [[120, 'Date1', 1.03], [120, 'Date2', 1.04], [120, 'Date3', 1.02], [240, 'Date1', 1.06], [240, 'Date2', 0.98], [240, 'Date3', 1.04], [381, 'Date2', 1.03], [381, 'Date3', 0.85]]

# 第一步:按股票编号分组收集数值
stock_data = {}
for entry in A:
    stock_id = entry[0]
    value = entry[2]
    # 如果股票编号不在字典里,就初始化一个空列表
    if stock_id not in stock_data:
        stock_data[stock_id] = []
    stock_data[stock_id].append(value)

# 第二步:计算每个股票数值的乘积
result = []
for values in stock_data.values():
    product = 1
    for v in values:
        product *= v
    result.append(round(product, 6))  # 可选:保留6位小数和预期结果一致

print(result)  # 输出: [1.092624, 1.080352, 0.8755]

为什么这个方法好用?

  • 不管同一股票的条目是不是连续排列,都能准确收集所有数值
  • 逻辑清晰,新手也容易理解和调试

方法二:itertools.groupby(适合已排序的列表)

如果你的原始列表已经按股票编号排序(比如示例里的顺序),可以用itertools.groupby来简化分组步骤,代码会更简洁:

from itertools import groupby

A = [[120, 'Date1', 1.03], [120, 'Date2', 1.04], [120, 'Date3', 1.02], [240, 'Date1', 1.06], [240, 'Date2', 0.98], [240, 'Date3', 1.04], [381, 'Date2', 1.03], [381, 'Date3', 0.85]]

result = []
# 按股票编号分组,key函数取子列表的第一个元素
for stock_id, group in groupby(A, key=lambda x: x[0]):
    product = 1
    # 遍历当前分组的所有条目,取出数值相乘
    for item in group:
        product *= item[2]
    result.append(round(product, 6))

print(result)  # 输出: [1.092624, 1.080352, 0.8755]

注意事项:

groupby只会把连续的相同编号分到一组,如果你的列表里同一股票的条目是分散的,需要先排序:

# 先按股票编号排序
A_sorted = sorted(A, key=lambda x: x[0])
# 再用groupby处理...

方法三:用math.prod简化乘积计算(Python 3.8+)

Python 3.8及以上版本提供了math.prod函数,可以直接计算可迭代对象的乘积,不用手动写循环,代码会更简洁:

import math
from itertools import groupby

A = [[120, 'Date1', 1.03], [120, 'Date2', 1.04], [120, 'Date3', 1.02], [240, 'Date1', 1.06], [240, 'Date2', 0.98], [240, 'Date3', 1.04], [381, 'Date2', 1.03], [381, 'Date3', 0.85]]

# 字典方法的简化版
stock_data = {}
for entry in A:
    # setdefault可以简化判断和初始化的步骤
    stock_data.setdefault(entry[0], []).append(entry[2])

result = [round(math.prod(values), 6) for values in stock_data.values()]
print(result)

# groupby方法的简化版
result_groupby = [round(math.prod(item[2] for item in group), 6) for _, group in groupby(A, key=lambda x: x[0])]
print(result_groupby)

这样写出来的代码既简洁又易读,推荐在Python版本允许的情况下使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:52:49