基于子范围最大值自动选子列表:Python新手调整产品周常规价格
嘿,作为刚接触Python的新手,处理这种每周价格调整的需求确实需要一点小技巧,我来一步步帮你搞定!
解决思路:基于子范围最大值自动划分价格区间
你的需求核心是把52周的价格数据分割成连续的子范围(也就是连续几周的价格段),然后用每个子范围的最大值来作为调整的依据,这样就能批量处理价格调整,不用手动逐周设置。
第一步:准备好你的数据
首先把你的完整价格数据补全,我们先基于你给出的部分数据整理出完整示例(你可以直接替换成自己的真实数据):
# 1到52周的列表 Weeks = list(range(1, 53)) # 完整的当前常规价格列表(替换成你自己的真实数据) RegPriceNow = [5.99, 4.99, 4.99, 5.99, 5.99, 5.99, 5.99, 5.99, 4.99, 4.99, 6.49, 6.49, 6.49, 6.49, 6.49, 6.49, 6.49, 6.49, 6.49, 6.49, 5.49, 5.49, 6.49, 5.49, 6.49, 6.49, 6.49, 6.49, 5.49, 5.49, 5.99, 6.49, 5.99, 6.49, 5.99, 5.99, 6.49, 5.99, 5.99, 5.49, 5.99, 5.99, 6.49, 6.49, 5.99, 5.99, 5.49, 5.49, 5.99, 5.99, 6.49, 6.49]
第二步:实现自动划分区间的函数
我写了一个可自定义的函数,能根据价格波动自动划分子范围,核心逻辑是:当价格降到当前区间最大值的某个比例以下时,就分割出一个新的区间(你可以自由调整这个比例或者更换分割规则):
def get_max_based_ranges(weeks, prices, threshold_ratio=0.9): # 先检查输入数据是否合法 if not weeks or not prices or len(weeks) != len(prices): return [] ranges = [] # 初始化第一个区间的起始周、最大值和价格列表 start_week = weeks[0] current_max = prices[0] current_prices = [prices[0]] # 从第二周开始遍历 for i in range(1, len(prices)): current_price = prices[i] # 更新当前区间的最大值 if current_price > current_max: current_max = current_price current_prices.append(current_price) # 当价格低于当前最大值的threshold_ratio时,分割区间 if current_price < current_max * threshold_ratio: # 把当前区间存入结果 ranges.append({ "start_week": start_week, "end_week": weeks[i-1], "max_price": current_max, "original_prices": current_prices.copy() }) # 初始化新的区间 start_week = weeks[i] current_max = current_price current_prices = [current_price] # 处理最后一个区间 ranges.append({ "start_week": start_week, "end_week": weeks[-1], "max_price": current_max, "original_prices": current_prices.copy() }) return ranges
调用这个函数,就能得到所有自动划分的子范围:
# 获取划分好的区间 price_ranges = get_max_based_ranges(Weeks, RegPriceNow) # 打印每个区间的信息,方便查看 for idx, rng in enumerate(price_ranges, 1): print(f"区间 {idx}: 第{rng['start_week']}周 - 第{rng['end_week']}周,最大值: {rng['max_price']}") print(f"原始价格: {rng['original_prices']}\n")
第三步:生成调整后的目标价格列表
如果你想直接把每个子范围的最大值作为调整后的目标价格,可以用下面的代码生成完整的目标价格列表:
target_prices = [] for rng in price_ranges: # 给当前区间的所有周设置为该区间的最大值 target_prices.extend([rng['max_price']] * len(rng['original_prices'])) # 打印调整后的价格列表,和Weeks一一对应 print("调整后的目标价格列表:") print(target_prices)
调整逻辑的自定义
如果你不需要用阈值来分割区间,比如只想把连续相同价格的周划分为一个子范围,只需要修改函数里的分割条件:
把if current_price < current_max * threshold_ratio:改成if current_price != current_max:就行,这样相同价格的连续周会被自动归为一个区间,最大值就是该价格本身。
如果你有其他分割规则(比如按固定周数划分、按价格涨跌幅度划分),也可以修改这个判断条件,新手可以先从简单的规则开始测试,慢慢调整到符合自己需求的逻辑。
内容的提问来源于stack exchange,提问作者Asif
相关产品推荐
相关产品推荐

