我有兩個元組列表[[1,3000],[2,5000],[3,7000],[4,10000]][[1,2000],[2,3000],[3,4000],[4,5000]] 總和是 10000。這里我們有 [2,5000],[4,5000] 和 [3,7000],[2,3000] 所以輸出應該是[2,4]和[3,2][[1,2000],[2,4000],[3,6000]][[1,2000]]總和是 7000。這里因為我沒有總和為 7000 的組合,我考慮了所有可能的組合 4000(2000+2000),6000(4000+2000) 和 8000(6000+2000) 并考慮從所需的總和為 6000 。對于 6000,我的輸出應該是 [2,4000] 和 [1,2000],即[2,1]這是我的代碼import itertoolsdef optimalUtilization(maximumOperatingTravelDistance, forwardShippingRouteList, returnShippingRouteList): result=[] t1=[] t2=[] for miles in forwardShippingRouteList: t1.append(miles[1]) for miles in returnShippingRouteList: t2.append(miles[1]) result.append(t1) result.append(t2) total_sum=set() for element in list(itertools.product(*result)): if sum(element)<=maximumOperatingTravelDistance: total_sum.add(sum(element)) total_sum=sorted(total_sum,reverse=True) return optimalUtilizationhelper(total_sum[0], forwardShippingRouteList, returnShippingRouteList)def optimalUtilizationhelper(maximumOperatingTravelDistance, forwardShippingRouteList, returnShippingRouteList): dist_dict={} for carid,miles in forwardShippingRouteList: dist_dict.update({miles:carid}) result=[] for carid,miles in returnShippingRouteList: if (maximumOperatingTravelDistance-miles) in dist_dict: result.append(list((dist_dict[maximumOperatingTravelDistance-miles],carid))) return result有沒有更好的pythonic方法來做到這一點?驅動程序代碼print(optimalUtilization(20, [[1,8],[2,7],[3,14]], [[1,5],[2,10],[3,14]]))
1 回答

隔江千里
TA貢獻1906條經驗 獲得超10個贊
以下是更簡潔和線性的組合數量:
from itertools import product
def optimalUtilization(n, l1, l2):
# all (index1, index2, sum) triplets where sum is at most n
res = [(a[0], b[0], a[1]+b[1]) for a, b in product(l1, l2) if a[1]+b[1] <= n]
m = max(res, key=lambda x: x[2])[2] # max sum <= n
return [x[:2] for x in res if x[2] == m]
>>> optimalUtilization(20, [[1,8],[2,7],[3,14]], [[1,5],[2,10],[3,14]])
[(3, 1)]
無論是更易讀還是更 Pythonic,肯定是有爭議的 :)
更新:不再需要排序和分組。
添加回答
舉報
0/150
提交
取消