如何按股票编号分组计算嵌套列表对应第三元素的乘积?
计算嵌套列表中各股票对应数值的乘积
问题回顾
你现在有一个包含多股票数据的嵌套列表,每个子列表的第一个元素是股票编号,第三个元素是需要计算乘积的数值。现有代码只能处理单股票的情况,需要一个通用方法来处理任意数量、任意数据量的股票。
先把你的示例数据和预期结果再明确下:
示例输入:
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
相关产品推荐
相关产品推荐

