我写了一个逻辑来查找位置的可用数量, 用字典管理位置和数量,
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
答案 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的答案会很好。这个答案是行不通的。但如果允许重复,那么这个就可以了。