根据多个值的总和从字典中进行匹配

时间:2018-11-30 12:43:53

标签: python python-3.x

我有两个字典如下。一个用于服务,另一个用于可以提供服务的供应商。每种服务可以由多个供应商提供。

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]....}

1 个答案:

答案 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

根据特定要求和您用于存储数据的方式,可能会并且应该改进代码。