Python:为 eactly 2 PROD_ID 查找 ORDER_ID

我有下面的python列表列表。我需要找出仅订购 P1 和 P2(除了 P1 和 P2)产品的 order_ids。预期答案:5 和 9


# ORDER_ID, PROD_ID, ORDER_DT, QUANTITY


orders = [

[9, 'P1', '2020-01-01', 1],

[9, 'P2', '2020-01-01', 1],

[6, 'P1', '2020-01-01', 1],

[6, 'P3', '2020-01-01', 1],

[6, 'P4', '2020-01-01', 1],

[7, 'P1', '2020-01-01', 1],

[7, 'P2', '2020-01-01', 1],

[7, 'P3', '2020-01-01', 1],

[5, 'P2', '2020-01-01', 1],

[5, 'P1', '2020-01-01', 1]

]


暮色呼如
浏览 101回答 2
2回答

鸿蒙传说

考虑使用pandas- 对于此类任务来说更好:import pandas as pdorders = [[9, 'P1', '2020-01-01', 1],[9, 'P2', '2020-01-01', 1],[6, 'P1', '2020-01-01', 1],[6, 'P3', '2020-01-01', 1],[6, 'P4', '2020-01-01', 1],[7, 'P1', '2020-01-01', 1],[7, 'P2', '2020-01-01', 1],[7, 'P3', '2020-01-01', 1],[5, 'P2', '2020-01-01', 1],[5, 'P1', '2020-01-01', 1]]cols="ORDER_ID,PROD_ID,ORDER_DT,QUANTITY".split(",")df=pd.DataFrame(orders, columns=cols)res=df.groupby("ORDER_ID")["PROD_ID"].agg(set).eq({'P1', 'P2'})res=res.loc[res].indexres=df.loc[df["ORDER_ID"].isin(res)]print(res)#if you want end up with the numpy:print(res.to_numpy())#to get just the order_id-s:print(res["ORDER_ID"].unique())输出:>>> print(res)   ORDER_ID PROD_ID    ORDER_DT  QUANTITY0         9      P1  2020-01-01         11         9      P2  2020-01-01         18         5      P2  2020-01-01         19         5      P1  2020-01-01         1>>> print(res.to_numpy())[[9 'P1' '2020-01-01' 1] [9 'P2' '2020-01-01' 1] [5 'P2' '2020-01-01' 1] [5 'P1' '2020-01-01' 1]]>>> print(res["ORDER_ID"].unique())[9 5]

桃花长相依

您可以使用itertools.groupby. 这样,您可以根据订单 ID 对产品进行分组,然后将所有相关订单放在一个列表中。然后,您只需要确保产品 ID 匹配。就像是:from itertools import groupbyfrom operator import itemgetterproducts = []for key, group in groupby(orders, key=itemgetter((0))):    if {prod[1] for prod in group} == {'P1', 'P2'}:        products.append(key)print(products)这确实给出了:[9, 5]这假设列表orders是根据订单 ID 排序的,如示例中所示。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python