从字典中查找可用数量

时间:2013-06-18 08:51:25

标签: python dictionary

我写了一个逻辑来查找位置的可用数量, 用字典管理位置和数量,

d={'loc2': 500.0, 'loc3': 200.0, 'loc1': 1000.0, 'loc4': 100.0, 'loc5': 50.0}

def find_combination(locations,qty): 
    new_list = sorted(locations.items(),key=lambda y: y[1],reverse=True)
    result = []
    while qty > 0:
        min_item = ''
        for item in new_list:
            if item[0] in result: 
                continue
            new_diff = abs(qty - item[1])
            if not min_item or new_diff <= min_diff:
                min_item = item[0]
                min_diff = new_diff
                min_val = item[1]
        result.append((min_item ,locations.get(min_item)))
        qty = qty - min_val
    return result

现在当数量为nelow时,dict中的最大数量会产生意外结果,

print find_combination(d,500)
OUTPUT: [('loc2', 500.0)]
print find_combination(d,1000)
OUTPUT: [('loc1', 1000.0)]
print find_combination(d,750)
OUTPUT: [('loc2', 500.0), ('loc3', 200.0), ('loc5', 50.0)]
print find_combination(d,1800)
OUTPUT: [('loc1', 1000.0), ('loc1', 1000.0)] # unexpected

3 个答案:

答案 0 :(得分:2)

你能解释为什么输出出乎意料吗?将loc1项附加到result后,qty的值将为800。行new_diff = abs(qty - item[1])将在下一次迭代中再次为项loc1返回最小值(200),以便该项再次添加到result。完成后,qty将为-200,因此while循环将终止。如果关联数量小于变量qty,您是否应该添加项目?如果是这样,您需要更多逻辑 - 您可以将for循环更改为:

for item in [x for x in new_list if x[1] <= qty]:

答案 1 :(得分:1)

这就是你想要的:

d={'loc2': 500.0, 'loc3': 200.0, 'loc1': 1000.0, 'loc4': 100.0, 'loc5': 50.0}
from operator import itemgetter
def find_combination(locs,qty):
    locs = sorted(d.items(),key=itemgetter(1),reverse=True) #get them in descending order
    result = []
    for loc,val in locs:
        if qty <= 0: #if we've reached the target qty then need to look no further
            break
        elif qty - val >= 0: #if we can take the val of a location and not go below zero do so
            qty -= val
            result.append((loc,val)) 
    return result 

当你

print find_combination(d,1800)
[('loc1', 1000.0), ('loc2', 500.0), ('loc3', 200.0), ('loc4', 100.0)]
>>>

答案 2 :(得分:1)

以下代码是否符合您的要求?我使用整数除法来跟踪剩余数量。


def find_combination(locations,qty): 
    new_list = sorted(locations.items(),key=lambda y: y[1],reverse=True)
    result = []
    for item in new_list:
        quotient = int(qty / item[1])
        result.extend(quotient*[item])
        qty -= quotient*item[1]
    return result

编辑:由于您使用了支票if item[0] not in result,我假设您不想重复结果中的任何项目。在这种情况下,HennyH的答案会很好。这个答案是行不通的。但如果允许重复,那么这个就可以了。