【问题标题】:Finding all combinations of length 3 from a set of numbers such that sum(combination) is 0从一组数字中找到长度为 3 的所有组合,使得 sum(combination) 为 0
【发布时间】:2014-06-21 15:07:12
【问题描述】:

假设 S 是一组整数,例如 {-4,-2,1,2,5,0}。我想写一个理解,以获得所有三元素元组 (i,j,k) 的列表,这样 i,j,k 是 S 和 i+j+k == 0 的元素。

【问题讨论】:

  • 我们不会做你的功课。你需要先表现出自己的一些努力。
  • 你自己试过吗?
  • 欢迎来到堆栈溢出,您似乎收到了学校作业或希望我们为您完成所有工作。尽管我们倾向于以任何方式提供帮助,但我们希望您自己表现出某种形式的努力。到目前为止,您尝试了什么?您是否遇到任何我们可以帮助解决的错误?向我们展示您的尝试,我们可以将您引向正确的方向,但是为您编写所有内容或为您查找库并不是 stackoverflow 的目的。
  • i,j,k 必须是 S 的不同元素吗?
  • 我没有做任何功课,只是陷入了python中的一些线性代数计算。因此,在不使用任何库的情况下将需要您的帮助。 @timgeb i,j,k 可以是任何示例集。

标签: python permutation list-comprehension


【解决方案1】:

原帖:

据我了解您的问题和对我的评论的回答,i,j,k 中的任何值都可能是您设置的S 中的任何值。

>>> [(i,j,k) for i in S for j in S for k in S if i+j+k == 0]
[(0, 0, 0), (0, 2, -2), (0, -2, 2), (1, 1, -2), (1, -2, 1), (2, 0, -2), (2, 2, -4), (2, -4, 2), (2, -2, 0), (-4, 2, 2), (-2, 0, 2), (-2, 1, 1), (-2, 2, 0)]

编辑

由于问题已澄清,即不能两次选择相同的值,因此此答案需要更新。

>>> from itertools import permutations, combinations
>>> S={-4,-2,1,2,5,0}
>>> [x for x in permutations(S,3) if sum(x) == 0]
[(0, 2, -2), (0, -2, 2), (2, 0, -2), (2, -2, 0), (-2, 0, 2), (-2, 2, 0)]
>>> [x for x in combinations(S,3) if sum(x) == 0]
[(0, 2, -2)]

使用permutationscombinations(我还没有弄清楚你想要哪个)。

【讨论】:

  • 我错误地认为这允许从S 中提取相同的号码3 次......例如,在第一组号码(0, 0, 0) 中显示。 OP 问题中的S 只有一个0
  • @martineau 我要求 OP 澄清是否可以多次选择相同的数字,据我了解他的回答,这种行为是允许的。
  • @timgeb 不能多次选择相同的数字。最多只能选择一次,但三个元组之和必须等于0。
【解决方案2】:

itertools docs 实际上向您展示了用于组合的等效 python 代码

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = range(r)
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)

print [ x for x in combinations(s,3) if sum(x)==0]
[(0, 2, -2)]

【讨论】:

  • 我认为i,j,k 中的任何值都可能是集合中的任何值(检查问题上的 cmets)
  • @timgeb 组合和排列是两个不同的东西,OP 在问题中使用组合,所以我提供了一个组合解决方案。
【解决方案3】:

假设同一个数不能多次使用来计算总和:

from itertools import combinations

S = {-4, -2, 1, 2, 5, 0}
zero_sums = [(i, j, k) for i, j, k in combinations(S, 3) if not sum((i, j, k))]
print(zero_sums)  # -> [(0, 2, -2)]

您可以通过打印所有组合及其总和来验证这是否正确:

for i, j, k in combinations(S, 3):
    print('({:2d}, {:2d}, {:2d}) = {:2d}'.format(i, j, k, sum((i, j, k))))

输出:

( 0,  1,  2) =  3
( 0,  1,  5) =  6
( 0,  1, -4) = -3
( 0,  1, -2) = -1
( 0,  2,  5) =  7
( 0,  2, -4) = -2
( 0,  2, -2) =  0
( 0,  5, -4) =  1
( 0,  5, -2) =  3
( 0, -4, -2) = -6
( 1,  2,  5) =  8
( 1,  2, -4) = -1
( 1,  2, -2) =  1
( 1,  5, -4) =  2
( 1,  5, -2) =  4
( 1, -4, -2) = -5
( 2,  5, -4) =  3
( 2,  5, -2) =  5
( 2, -4, -2) = -4
( 5, -4, -2) = -1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2018-01-05
    • 2017-11-10
    相关资源
    最近更新 更多