列表的高级过滤

时间:2018-05-11 20:59:02

标签: python python-3.x

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)

我编写了以下程序(上图),该程序根据概率输出20个项目的订单拣配清单:

(['Item91', 10.0, 1.0],)
(['Item482', 6.0, 15.0],)
(['Item533', 8.0, 17.0],)
(['Item63', 7.0, 2.0],)
(['Item50', 5.0, 5.0],)
(['Item14', 2.0, 2.0],)
(['Item145', 1.0, 6.0],)
(['Item225', 6.0, 9.0],)
(['Item23', 3.0, 2.0],)
(['Item33', 4.0, 2.0],)
(['Item47', 5.0, 4.0],)
(['Item88', 9.0, 4.0],)
(['Item8', 1.0, 4.0],)
(['Item1', 1.0, 1.0],)
(['Item13', 2.0, 2.0],)
(['Item21', 3.0, 1.0],)
(['Item86', 9.0, 3.0],)
(['Item205', 5.0, 6.0],)
(['Item1', 1.0, 1.0],)
(['Item67', 7.0, 4.0],)

每个项目都有两个数字,分别对应过道(仓库中)的过道和槽位。现在的目的是过滤所有重复通道被移除的列表,并且只留下相应过道的最远槽。

示例:过道1有四个要挑选的项目。要计算订单拣货员的旅行时间(退货路线政策),我只需要最远物品的位置。那将是过道1中的第6个槽。因此我想过滤所有过道1重复并且只保留([1.0,6.0],)。

因此,对于所有过道,我想要以下列表:

由此:

([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],)

我确实设法在excel中找到了解决方案。首先删除所有重复项,然后使用剩余的重复项查找相应值的最大值。是否有一种很好的方法来实现这种"高级"在Python中过滤?

1 个答案:

答案 0 :(得分:0)

以上是其他人建议的基于熊猫的解决方案。它使用类似sql的分组。

import pandas as pd

datin = [['Item91', 10.0, 1.0],
         ['Item482', 6.0, 15.0],
         ['Item533', 8.0, 17.0],
         ['Item63', 7.0, 2.0],
         ['Item50', 5.0, 5.0],
         ['Item14', 2.0, 2.0],
         ['Item145', 1.0, 6.0],
         ['Item225', 6.0, 9.0],
         ['Item23', 3.0, 2.0],
         ['Item33', 4.0, 2.0],
         ['Item47', 5.0, 4.0],
         ['Item88', 9.0, 4.0],
         ['Item8', 1.0, 4.0],
         ['Item1', 1.0, 1.0],
         ['Item13', 2.0, 2.0],
         ['Item21', 3.0, 1.0],
         ['Item86', 9.0, 3.0],
         ['Item205', 5.0, 6.0],
         ['Item1', 1.0, 1.0],
         ['Item67', 7.0, 4.0]]

pd.DataFrame(datin, columns=['Item', 'Aisle', 'Slot']).groupby(by='Aisle', as_index=False)['Slot'].max().values.tolist()