我有两个字典如下。一个用于服务,另一个用于可以提供服务的供应商。每种服务可以由多个供应商提供。
service = {'service1': {'serviceId': 's0001', 'cost': 220},
'service2': {'serviceId': 's0002', 'cost': 130}....}
supplier = {'supplier1': {'supplierId': 'sup1', 'bid': 30},
'supplier2': {'supplierId': 'sup2', 'bid': 12},
'supplier3': {'supplierId': 'sup3', 'bid': 30}....}
我希望有一个新的词典,其中包含多个投标的总和大于或等于服务成本,从而为供应商提供匹配的服务。像这样:
matched = {'service1': [sup1, sup2, sup100],
'service2': [sup20, sup64, sup200, sup224]....}
假设两个词典中都有大量条目,那么进行这种所需匹配的一种好方法是什么?可以提供单一服务的供应商数量没有限制。 我累了以下内容,但没有用。
match = {}
for key, value in service.items():
if service[key]['cost'] >= supplier[key]['bid']:
match[key] = [sup for sup in supplier[key]['supplierID']]
以下是预期的输出:
matched = {'service1': [sup1, sup2, sup100], 'service2': [sup20, sup64, sup200, sup224]....}
答案 0 :(得分:0)
我认为we have huge number of entries in both dictionaries
。这就是我要解决的问题的方式:
import numpy as np
# data
service = {'service1': {'serviceId': 's0001', 'cost': 12},
'service2': {'serviceId': 's0002', 'cost': 30}}
supplier = {'supplier1': {'supplierId': 'sup1', 'bid': 30},
'supplier2': {'supplierId': 'sup2', 'bid': 12},
'supplier3': {'supplierId': 'sup3', 'bid': 30}}
# lists of suppliers' IDs and bids
sups, bids = list(), list()
for key, info in supplier.items():
sups.append(info['supplierId'])
bids.append(info['bid'])
# sorted lists of suppliers' IDs and bids to allow binary search
bids, sups = zip(*sorted(zip(bids, sups)))
# main loop
matched = dict()
for key, info in service.items():
matched[key] = sups[:np.searchsorted(bids, info['cost'], side='right')]
matched
:
{'service1': ('sup2',), 'service2': ('sup2', 'sup1', 'sup3')}
此代码无法轻松实现新条目的处理,但允许这样做。对于每个新的service_record
,我们必须执行一个二进制搜索;对于每个新的supplier_record
,我们必须执行单个二进制搜索,并在service
上循环以更新matched
。
根据特定要求和您用于存储数据的方式,可能会并且应该改进代码。