【问题标题】:Maximize the sum of second element of tuples based on the sum of the first element in the lists of tuples根据元组列表中第一个元素的总和最大化元组的第二个元素的总和
【发布时间】:2022-10-21 22:40:22
【问题描述】:

我有几个元组列表,这里我以其中两个为例:

a = [(266.59, 0.0),(269.62, 0.2),(270.91, 0.4),(271.39, 0.6),(271.44, 0.8),(268.94, 1.0)]
b = [(661.47, 0.0),(671.5, 0.2),(678.35, 0.4),(683.31, 0.6),(686.82, 0.8),(689.22, 1.0)]

当第一个元素的总和最大化而元组的第二个元素的总和等于 0.8 时,我想在两个列表中找到这对元组。

以下组合导致第二个元素的总和等于 0.8:

[(266.59, 0.0), (686.82, 0.8)] 
[(661.47, 0.0), (271.44, 0.8)]
[(269.62, 0.2), (683.31, 0.6)]
[(671.5, 0.2), (271.39, 0.6)]
[(270.91, 0.4), (678.35, 0.4)]

其中 [(266.59, 0.0), (686.82, 0.8)] 给出了第一个元素的最大总和; 953.41。

在我的代码中,我创建了所有对的组合,过滤它们以使第二个元素的总和等于 0.8,然后找到第一个元素的总和最大的对。

这是代码:

In [1] combination = list(itertools.product(a,b))
In [2] _2nd_sum = [list(map(sum, zip(*list(comb))))[1] for  comb  in  combination]
In [3] true_indeces = [i for i,GL in enumerate(_2nd_sum) if GL==0.8]
In [4] selected = [combination[i] for i in true_indeces]
In [5] print(selected)

Out [1] [((266.59, 0.0), (686.82, 0.8)), ((269.62, 0.2), (683.31, 0.6)), ((270.91, 0.4), (678.35, 0.4)), ((271.39, 0.6), (671.5, 0.2)), ((271.44, 0.8), (661.47, 0.0))]

In [6] _1st_sum = [list(map(sum, zip(*list(selected))))[0] for selected  in  selected]
In [7] _1st_Max = max(_1st_sum)
In [8] selected[_1st_sum.index(_1st_Max )]
Out [2] ((266.59, 0.0), (686.82, 0.8))

当我只有很少的元组列表时,此代码工作正常,但是当列表数量超过 15 时,由于在第 1 行创建组合时计算繁重,它会给出“内存错误”。知道如何在处理 15 时解决问题列表甚至更多?

【问题讨论】:

  • 您是否尝试过使用生成器?
  • 当您有两个以上的列表时,我不明白您要达到的目标。它仍然只是一对元组吗?我需要从不同的列表中选择它们吗?列表 A 可以与列表 B 和列表 C 组合,等等?
  • 您首先生成所有组合,以便稍后过滤正确的组合。易于编码,但浪费计算时间。使用自己的代码/功能创建候选者,而不是使用 product 跳过考虑整个组合分支。对第二个元组项上的列表进行排序,以便在没有机会获得所需总和的情况下更容易打破循环。内存问题可以通过只使用迭代器来解决,但是如果你不跳过大量的组合来进行实际评估,那么你会遇到很多列表的冗长计算时间。

标签: python-3.x


【解决方案1】:

您首先生成所有组合,以便稍后过滤正确的组合。易于编码,但浪费计算时间。与寻找第一个总和的最大值相同。

使用自己的代码/功能创建候选人,而不是使用产品跳过考虑整个组合分支。以相反的顺序对第二个元组项上的列表进行排序,以便在没有机会获得所需总和的情况下更容易打破循环。

内存问题可以通过只使用迭代器来解决,但是如果你不跳过大量的组合来进行实际评估,那么你会遇到很多列表的冗长计算时间。

最好将第一步与第二步结合起来,同时检查所有条件:

  • 第二个总和是否已经大于正确的总和(跳过组合分支)?
  • 所有元组的第二个总和是否低于右侧(跳过组合分支)?
  • 第二个总和是正确的吗?
  • 第一个总和是否大于所有先前组合的最大值(为了以后检查而记住它)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多