lis元组中的成对加法元素

2024-10-02 22:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个元组列表

[[1,3000],[2,5000],[3,7000],[4,10000]]
[[1,2000],[2,3000],[3,4000],[4,5000]] 

总数是一万。这里我们有[25000],[45000]和[37000],[23000],所以输出应该是[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,我的输出应该是[24000]和[12000],这是[2,1]

这是我的密码

import itertools

def 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

有没有更好的Python方法?你知道吗

驱动程序代码

print(optimalUtilization(20,
                [[1,8],[2,7],[3,14]],
                [[1,5],[2,10],[3,14]]))

Tags: infordistresultdicttotalsumt1
1条回答
网友
1楼 · 发布于 2024-10-02 22:28:14

对于组合的数量,以下是更简洁和线性的:

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)]

无论是更具可读性还是更具python风格,都值得商榷:)

更新:不再需要排序和分组。你知道吗

相关问题 更多 >