【发布时间】: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