Python 在列表的元组中成对添加元素

Python 在列表的元组中成对添加元素,python,python-3.x,Python,Python 3.x,我有两个元组列表 [[1,3000],[2,5000],[3,7000],[4,10000]] [[1,2000],[2,3000],[3,4000],[4,5000]] 总数是10000。这里有[25000]、[45000]和[37000]、[23000],因此输出应该是[2,4]和[3,2] [[1,2000],[2,4000],[3,6000]] [[1,2000]] 总数是7000。这里,因为我没有一个总和为7000的组合,我考虑所有可能的组合4000(2000+2000)、600

我有两个元组列表

[[1,3000],[2,5000],[3,7000],[4,10000]]
[[1,2000],[2,3000],[3,4000],[4,5000]] 
总数是10000。这里有[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]

[[1,2000],[2,4000],[3,6000]]
[[1,2000]]
这是我的密码

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

以下是关于组合数量的更简明和线性的wrt:

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)]
来自itertools导入产品的

def最佳利用率(n、l1、l2):
#所有(index1,index2,sum)三元组,其中sum最多为n
如果a[1]+b[1]>最优利用率(20,[[1,8],[2,7],[3,14],[[1,5],[2,10],[3,14]),则乘积(l1,l2)中a,b的res=[(a[0],b[0],a[1]+b[1])
[(3, 1)]
这本书更具可读性还是更具Python风格,这当然是有争议的:)


更新:不需要更多的排序和分组。

这不是一个元组列表。它几乎是两个独立的元组列表,但是有一个零散的
]
也使得它无效。你能编辑一下这个,让我们看看你的实际值吗?我们不必猜测。@vash_the_the_stamped这里没有3700。有一个
[37000]
的列表;这就是让你困惑的原因吗?哦,我的意思是我厌倦了间距:(不管怎样,如果你有工作代码,你只是在寻找改进的方法,这可能是一个问题,而不是堆栈溢出。(但在发布之前阅读,确保它是主题,而不是信任某个在该网站上只有341个代表的人…)这有多快?对我来说,复杂性是n^2lognI没有用大的输入来计时。你为什么不试试呢?@Rohit我已经更新了我的答案。它应该是渐近最优的。在
产品的大小上,你不可能比
O(n)
更好。你是说itertools.product做O(n)操作吗?@Rohit没有。它显然是O(nm).nm是我指的产品的尺寸。