当前位置: 首页 > 知识库问答 >
问题:

python3.x - python列表组合高效率方法?

洪越泽
2023-07-26

a = [i for i in range(1, 8000)]

假如有个这样的列表, 我需要把里面的所有值组合 然后求 组合的总和与100差的最小值。

例如 1和2组合 1+2 =3 与100 差 3-100 == -97 , 1和3组合 1+3-100 = -96 , 1和4组合,1+4-100=-95..... 1+99-100=0 ....依次类推, 1+2+3+4+5+6...+7999-100=?

则最小值依次为97, 96,95...0 然后找出最小的值就是0. 并且把符合 最小值等于0的组合 都放到一个列表中。

最终得到 a1= [[1,99],[2,98],......[1,2,97],....[1,2,3,94].........]

有没有高效的计算方法?

正常的计算方法 效率都比较低效率。

共有2个答案

甄永年
2023-07-26

可以用动态规划

def find_min_difference(a, target):    n = len(a)    dp = [float('inf')] * (target + 1)    dp[0] = 0    for num in a:        for t in range(target, num - 1, -1):            dp[t] = min(dp[t], dp[t - num] + num)    min_diff = dp[target]    result = []    def find_combinations(curr_comb, idx, remaining_diff):        nonlocal min_diff, result        if remaining_diff == 0:            if len(curr_comb) > 1:                result.append(curr_comb[:])            return        if idx == n:            return        if dp[remaining_diff] == dp[remaining_diff - a[idx]] + a[idx]:            find_combinations(curr_comb + [a[idx]], idx + 1, remaining_diff - a[idx])        find_combinations(curr_comb, idx + 1, remaining_diff)    find_combinations([], 0, min_diff)    return resulta = [i for i in range(1, 8000)]target = 100result = find_min_difference(a, target)print(result)
孔鸿宝
2023-07-26
def find_combinations(target_sum, numbers):    i, j = 0, len(numbers) - 1    combinations = []    while i < j:        if numbers[i] + numbers[j] == target_sum:            combinations.append([numbers[i], numbers[j]])            i += 1            j -= 1        elif numbers[i] + numbers[j] < target_sum:            i += 1        else:            j -= 1    return combinationsa = [i for i in range(1, 8000)]target_sum = 100combinations = find_combinations(target_sum, a)

前10个组合

[[1, 99], [2, 98], [3, 97], [4, 96], [5, 95], [6, 94], [7, 93], [8, 92], [9, 91], [10, 90]]
 类似资料:
  • 问题内容: 有关内置python列表对象的快速问题。假设您有一个数字为0-99的列表。您正在编写一个将列表中的最后一项用于其他目的的程序。使用list [-1]比使用list [99]更有效吗?换句话说,无论哪种情况,python都会遍历整个列表吗? 谢谢你的帮助。 问题答案: Python不会遍历列表来查找特定索引。列表是连续内存中的数组(指向元素的指针),因此查找所需元素始终是简单的乘法和加法

  • 问题内容: 例: 结果是: 如您所见,与列表相比,对数组进行屏蔽的操作更为优雅。如果您尝试使用列表中的数组屏蔽方案,则会收到错误消息: 问题是要为s找到一个优雅的蒙版。 更新: 通过引入的答案,但是提出的要点使解决方案完全符合我的兴趣。 问题答案: 你在找 文档中的示例 相当于:

  • 本文向大家介绍盘点提高 Python 代码效率的方法,包括了盘点提高 Python 代码效率的方法的使用技巧和注意事项,需要的朋友参考一下 第一招:蛇打七寸:定位瓶颈 首先,第一步是定位瓶颈。举个简单的栗子,一个函数可以从1秒优化到到0.9秒,另一个函数可以从1分钟优化到30秒,如果要花的代价相同,而且时间限制只能搞定一个,搞哪个?根据短板原理,当然选第二个啦。 一个有经验的程序员在这里一定会迟疑

  • 我收到一份作业,要求我将总共有N个元素的K个排序列表有效地合并到一个排序列表中。我偶然发现的方法是使用最小堆对K列表中的元素进行排序,或者使用分而治之的方法(成对合并)。该线程中的注释表明,分而治之方法的时间复杂度为O(NK),而最小堆方法的时间复杂度为O(N log K),两者的空间复杂度相同。我还访问了许多其他线程,但我不能得到一个清晰的图片。 怀疑 许多其他网站告诉我们,两者都存在分歧

  • 问题内容: 迭代效率与CPython中相同项目列表的迭代效率一样吗? 问题答案: 这取决于您使用的Python版本。在Python 2中,创建一个新列表,这会花费一些额外的时间并消耗更多的内存。另一方面,一旦创建了列表,它就是一个列表,因此在完成列表创建的开销之后,应该具有相同的性能特征。 在Python 3中,创建视图对象而不是列表,并且我预计创建和迭代将比Python 2中更快,因为无需复制任

  • 我想把两个列表合并成一个列表列表。反之亦然。我找不到任何工作,我对Python非常陌生 例子: 如何将S拆分回原来的S1和S2?示例: