如何基于给定数值列表使用Python迭代生成符合规则的行数据
实现思路
- 遍历输入的数值列表,每个元素对应一个自增的
rowid(从1开始计数),该元素就是当前rowid下所有quantity的累加和目标值 - 对每个目标值,循环生成1到剩余待凑数值之间的正整数作为
quantity,每生成一个就计算当前累加值total,将(rowid, quantity, total)存入结果集,直到累加和等于目标值 - 针对6万条输入的规模,优先采用低开销的存储方式,避免频繁的列表扩容开销,超大规模场景可以用numpy的向量化操作提升生成效率
基础实现(兼容所有场景)
import random from typing import List, Tuple def generate_row_data(number_list: List[int]) -> List[Tuple[int, int, int]]: result = [] rowid = 1 for target_sum in number_list: current_total = 0 while current_total < target_sum: remaining = target_sum - current_total # 生成的随机数最大不超过剩余待凑值,保证不会超出目标总和 quantity = random.randint(1, remaining) current_total += quantity result.append((rowid, quantity, current_total)) rowid += 1 return result # 测试用例 if __name__ == "__main__": test_numbers = [2,7,3,5] data = generate_row_data(test_numbers) # 格式化输出表格 print(f"{'rowid':<6} | {'quantity':<8} | {'total':<5}") for row in data: print(f"{row[0]:<6} | {row[1]:<8} | {row[2]:<5}")
高性能实现(适配6万+条输入)
如果输入规模大、每个目标值数值较高,用numpy的向量化操作可以提升2~5倍的生成效率:
import numpy as np from typing import List def generate_row_data_high_perf(number_list: List[int]) -> np.ndarray: result_batches = [] rowid = 1 for target_sum in number_list: if target_sum <= 0: rowid += 1 continue # 批量生成随机切分点,计算得到和为target_sum的正整数序列 split_points = np.sort(np.random.choice(np.arange(1, target_sum), size=target_sum-1, replace=False)) quantities = np.diff(split_points, prepend=0, append=target_sum) totals = np.cumsum(quantities) # 批量生成当前rowid列 rowid_col = np.full(len(quantities), fill_value=rowid, dtype=int) result_batches.append(np.column_stack([rowid_col, quantities, totals])) rowid += 1 return np.vstack(result_batches) if result_batches else np.array([])
内容的提问来源于stack exchange,提问作者Handri Mauludin Maulana
相关产品推荐
相关产品推荐

