基于概率生成的拣货列表高级过滤:Python实现方案问询
解决通道重复、保留最大货位项的Python实现
背景回顾
嘿,这个需求用Python处理其实很高效,咱们可以用内置数据结构做一键式筛选,比Excel的分步操作更简洁直接~先理下你的场景:你已经用random.choices生成了带概率的20个货品列表,每个货品包含名称、通道(aisle)和货位(slot),现在要每个通道只留货位数值最大的那一项。
原始代码与输出
你生成拣货列表的代码是:
import random import xlwings as xw from collections import Counter wb = xw.Book('Test.xlsx') sheet = xw.sheets.active SKUs = sheet.range('A2:C693').value list_of_prob = sheet.range('D2:D693').value list_of_prob = [float(i) for i in list_of_prob] SKUs = random.choices(SKUs, weights=list_of_prob, k=20) for item in zip(SKUs): print(item)
生成的原始输出(简化为通道和货位部分):
([10.0, 1.0],) ([6.0, 15.0],) ([8.0, 17.0],) ([7.0, 2.0],) ([5.0, 5.0],) ([2.0, 2.0],) ([1.0, 6.0],) ([6.0, 9.0],) ([3.0, 2.0],) ([4.0, 2.0],) ([5.0, 4.0],) ([9.0, 4.0],) ([1.0, 4.0],) ([1.0, 1.0],) ([2.0, 2.0],) ([3.0, 1.0],) ([9.0, 3.0],) ([5.0, 6.0],) ([1.0, 1.0],) ([7.0, 4.0],)
你期望转换后的结果:
([10.0, 1.0],) ([6.0, 15.0],) ([8.0, 17.0],) ([2.0, 2.0],) ([1.0, 6.0],) ([3.0, 2.0],) ([4.0, 2.0],) ([9.0, 4.0],) ([5.0, 6.0],) ([7.0, 4.0],)
最优Python实现方案
用字典来处理是最高效的方式,因为字典的键具有唯一性,我们可以把通道(aisle)作为键,值保存当前该通道下货位最大的货品项。遍历一次列表就能完成筛选,时间复杂度是O(n),比先去重再查最大值的步骤更高效。
具体代码实现
在你生成SKUs列表之后,添加这段代码即可:
# 初始化空字典:键为通道号,值为对应最大货位的货品项 aisle_max_slot = {} for item in SKUs: # 提取当前货品的通道和货位(item结构:[名称, aisle, slot]) current_aisle = item[1] current_slot = item[2] # 逻辑:如果通道不在字典里,或当前货位比字典中已存的更大,就更新 if current_aisle not in aisle_max_slot or current_slot > aisle_max_slot[current_aisle][2]: aisle_max_slot[current_aisle] = item # 提取字典中的所有值,就是筛选后的最终列表 filtered_skus = list(aisle_max_slot.values()) # 按你原来的格式打印结果 for item in zip(filtered_skus): print(item)
代码解释
- 字典
aisle_max_slot自动帮我们完成通道去重:同一个通道只会保留货位最大的项,后续遇到同通道的小货位项会直接跳过。 - 一次遍历完成筛选,不需要额外的去重、排序操作,性能拉满。
- Python 3.7+的普通字典默认保留插入顺序,所以最终列表会保持通道第一次出现的顺序,同时保证每个通道都是最大货位的货品。
补充说明
如果你的SKUs列表里的项是元组而非列表,代码逻辑完全一致,只需要保持索引写法统一即可。这种方法不需要额外依赖库,用Python内置结构就能搞定,适合集成到你的拣货程序里做批量自动化处理。
内容的提问来源于stack exchange,提问作者Karim.C
相关产品推荐
相关产品推荐

