Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于查找反向平均值的Python代码(查找给出特定平均值的可能值集)_Python_Average - Fatal编程技术网

用于查找反向平均值的Python代码(查找给出特定平均值的可能值集)

用于查找反向平均值的Python代码(查找给出特定平均值的可能值集),python,average,Python,Average,背景:我在使用Python3,但如果有人用其他编程语言提供答案,我仍然可以使用它。任何关于函数、高效算法或编程技巧的建议都会有所帮助 问题:我有一个涉及四(4)个整数及其平均值的问题 所提供的信息: 1.集合中的整数数(4) 2.整数的平均值 所需信息: 1.可能导致给定平均值的值列表 注意:集合中的整数数量很小,因此生成列表的有效方法应该不会那么难,但到目前为止,我还是被卡住了。我从数字之和(平均值*4)开始,但还没有找到正确的迭代方法 编辑: 所有整数都是非负的。就我而言,它们也不超过8位。

背景:我在使用Python3,但如果有人用其他编程语言提供答案,我仍然可以使用它。任何关于函数、高效算法或编程技巧的建议都会有所帮助

问题:我有一个涉及四(4)个整数及其平均值的问题

所提供的信息: 1.集合中的整数数(4) 2.整数的平均值

所需信息: 1.可能导致给定平均值的值列表

注意:集合中的整数数量很小,因此生成列表的有效方法应该不会那么难,但到目前为止,我还是被卡住了。我从数字之和(平均值*4)开始,但还没有找到正确的迭代方法

编辑:
所有整数都是非负的。就我而言,它们也不超过8位。

使用总和N,而不是平均值

def all_possibilities(N, k=4):
    if k == 1:
        yield (N,)
        return
    for i in xrange(N+1):
        for p in all_possibilities(N-i, k-1):
            yield (i,) + p


print list(all_possibilities(5))
产生:

[(0, 0, 0, 5), (0, 0, 1, 4), (0, 0, 2, 3), (0, 0, 3, 2), (0, 0, 4, 1),
 (0, 0, 5, 0), (0, 1, 0, 4), (0, 1, 1, 3), (0, 1, 2, 2), (0, 1, 3, 1),
 (0, 1, 4, 0), (0, 2, 0, 3), (0, 2, 1, 2), (0, 2, 2, 1), (0, 2, 3, 0),
 (0, 3, 0, 2), (0, 3, 1, 1), (0, 3, 2, 0), (0, 4, 0, 1), (0, 4, 1, 0),
 (0, 5, 0, 0), (1, 0, 0, 4), (1, 0, 1, 3), (1, 0, 2, 2), (1, 0, 3, 1),
 (1, 0, 4, 0), (1, 1, 0, 3), (1, 1, 1, 2), (1, 1, 2, 1), (1, 1, 3, 0),
 (1, 2, 0, 2), (1, 2, 1, 1), (1, 2, 2, 0), (1, 3, 0, 1), (1, 3, 1, 0),
 (1, 4, 0, 0), (2, 0, 0, 3), (2, 0, 1, 2), (2, 0, 2, 1), (2, 0, 3, 0),
 (2, 1, 0, 2), (2, 1, 1, 1), (2, 1, 2, 0), (2, 2, 0, 1), (2, 2, 1, 0),
 (2, 3, 0, 0), (3, 0, 0, 2), (3, 0, 1, 1), (3, 0, 2, 0), (3, 1, 0, 1),
 (3, 1, 1, 0), (3, 2, 0, 0), (4, 0, 0, 1), (4, 0, 1, 0), (4, 1, 0, 0),
 (5, 0, 0, 0)]
一般来说,将有选择的(N+k-1,k-1)解决方案

利用
itertools.compositions
的较短解决方案是:

import itertools

def all_possibilities(N, k=4):
    for c in itertools.combinations(range(N + k - 1), k - 1):
        yield tuple(x - y - 1 for x, y in zip(c + (N + k - 1,), (-1,) + c))

假设你真的在寻找一组(唯一的)非负整数,你可以将这些整数命名为
a,b,c,d
,这样
a>b>c>d
,注意它们的总和必须是
average*4
。然后您可以找到具有以下生成器函数的组合:

def get_4set_with_average(average):
    target_float = average * 4.0
    target = int(target_float)
    if target_float != target or target < 6:
        raise ValueError('No combinations possible')
    for a in xrange(target):
        for b in xrange(a):
            for c in xrange(b):
                for d in xrange(c):
                    if a + b + c + d == target:
                        yield([a, b, c, d])

print list(get_4set_with_average(4))
def get_4set_with_average(平均值):
目标浮动=平均值*4.0
target=int(target\u float)
如果目标_浮动!=目标或小于6的目标:
raise VALUERROR('不可能有组合')
对于X范围内的目标:
对于X范围内的b(a):
对于X范围内的c(b):
对于X范围内的d(c):
如果a+b+c+d==目标:
收益率([a,b,c,d])
打印列表(使用平均值(4)获取设置)
通过考虑四个整数之间的关系,可以通过各种方式提高效率

given that...
    a > b > c > d >= 0 and a + b + c + d = target 
it must be that...
    3 <= a <= target - 3,
    2 <= b <= target - a - 1,
    (target - a - b) / 2 < c <= target - a - b
鉴于。。。
a>b>c>d>=0,a+b+c+d=target
一定是。。。

欢迎来到堆栈溢出!看起来你想让我们为你写些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。演示这项工作的一个好方法是,包括您迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(控制台输出、堆栈跟踪、编译器错误——任何适用的)。你提供的细节越多,你可能得到的答案就越多。我将在问题中添加我的代码。其中必须包含一些约束条件,例如所有整数都应为正。否则,可能会有无限多个组合。由于问题涉及一组整数,我假设它们必须是唯一的。但问题或许应该澄清这一点。
def get_4set_with_average(average):
    target_float = average * 4.0
    target = int(target_float)
    if target_float != target or target < 6:
        raise ValueError('No combinations possible')
    for a in xrange(3, target - 2):
        for b in xrange(1, min(a, target - a)):
            for c in xrange(int((target - a - b) / 2) + 1, 
                            min(b, target - a - b + 1)): 
                yield([a, b, c, target - a - b - c])