Python遍历循环时校验同ID组内sku_id关联数据的实现方法
实现思路与代码示例
核心步骤
- 先按
id对原始数据分组,注意用itertools.groupby前必须先按id排序——它只对连续相同键的元素分组 - 把每个分组拆成两类条目:
sku_id=104的条目,以及其他sku的条目 - 将其他sku的
quantity值存入集合,方便快速查找匹配值 - 逐个检查每个
sku_id=104的条目:- 计算其
quantity的一半值 - 检查该值是否存在于其他sku的quantity集合中
- 只要有一个
sku_id=104的条目不满足条件,就把该id加入结果集合
- 计算其
代码实现
from itertools import groupby # 原始数据 data = [ (21, 2, 10.0), (21, 104, 20.0), (22, 1, 371.0), (22, 104, 742.0), (23, 1, 114.0), (23, 104, 228.0), (25, 1, 2.0), (25, 104, 2.0) ] # 先按id排序,保证groupby能正确分组 sorted_data = sorted(data, key=lambda x: x[0]) invalid_ids = set() # 按id分组遍历处理 for id_val, group in groupby(sorted_data, key=lambda x: x[0]): group_list = list(group) # 拆分sku104条目和其他条目 sku104_items = [item for item in group_list if item[1] == 104] other_quantities = {item[2] for item in group_list if item[1] != 104} # 校验每个sku104条目 is_invalid = False for item in sku104_items: required_qty = item[2] / 2 if required_qty not in other_quantities: is_invalid = True break if is_invalid: invalid_ids.add(id_val) print("不符合要求的id集合:", invalid_ids) # 输出: 不符合要求的id集合: {25}
代码说明
- 用集合存储其他sku的quantity,是因为集合的查找效率为O(1),比列表遍历更高效
- 排序是
itertools.groupby的必要前提,否则相同id但不连续的元素会被分成不同组 - 只要分组内有一个sku104条目不满足条件,整个组就会被判定为无效
内容的提问来源于stack exchange,提问作者python_help
相关产品推荐
相关产品推荐

