【问题标题】:Loop searching all possible combinations in an array循环搜索数组中所有可能的组合
【发布时间】:2014-09-30 00:06:41
【问题描述】:

我在使用 python 算法时遇到问题。 我有一个包含 4 个值 [a,b,c,d] 的数组,它们是百分比,因此在任何给定时间 a+b+c+d=1。我需要一个循环来遍历这些数字的所有可能组合,步长为 0.1。示例:

[0,0,0,1]
[0,0,0.1,0.9]
[0,0.1,0.1,0.8]
[0.1,0.1,0.1,0.7]
.....
[0.1,0.1,0.2,0.6]
[0.1,0.1,0.3,0.5]
....
[1,0,0,0]

我创建了一个似乎溢出的代码......有什么帮助吗?我知道这是一个菜鸟问题...

def frange(start, stop, step):
    while start <= stop:
        yield start
        start += step

def distribuir(p,array):
    if len(array) == 3:
        array.append(p)
        print(Array)
        return
    for i in frange(0,1,0.1):
        temp = []
        temp.append(array)
        temp.append(i)
        distribuir(p-i,temp)

【问题讨论】:

  • 那么,您尝试过什么?如果您不知道如何以0.1 的步长从0.0 循环到1.0,请考虑如果您执行range(10) 并将每个值乘以0.1 会发生什么。一旦你有了这个,你应该知道如何写下一个循环(提示:如果第一个值是0.4,那么下一个值只需从0.0循环到0.6),然后下一个,和下一个。如果你卡在某个地方,你可以发布你的代码以及你卡在哪里。
  • @abarnert:它是 Python 中的分区实现。唯一的区别是缩放 0.1。
  • @GregHewgill:但这个问题是针对长度为 4 的所有分区,而不仅仅是长度为 4,并且没有 0s,并将 1, 1, 1, 7 和 7, 1, 1, 1 视为同一个分区,所有这些都与此处所需的输出不同。
  • 您知道,有时如果您获得了 90% 的解决方案,那么您自己做额外的 10% 可能是值得的。无论如何,我会打开这个,你可以解决它。
  • @GregHewgill:当然,但我认为 OP 不太可能弄清楚如何将该算法转换为处理排列的算法(除非可能通过获取每个值的所有排列然后过滤它们,这不是一个很好的解决方案)。

标签: python arrays loops


【解决方案1】:

具有很大优化空间的简单递归解决方案:

import itertools

def possibilities(prefix, size, values, total):                                                                                                                                               
    if size == 0:
        return [prefix] if sum(prefix) == total else []
    return itertools.chain(*map(
        lambda v: possibilities(prefix+[v], size-1, values, total),
        values
    ))

例子:

list(
    map(
        lambda t: map(float, t),
        possibilities(
            prefix=[],
            size=3,
            values=map(Decimal, ['0', '0.1', '0.2', '0.3']),
            total=Decimal('0.4')
        )
    )
)                                                                            

输出:

[[0.0, 0.1, 0.3],
 [0.0, 0.2, 0.2],
 [0.0, 0.3, 0.1],
 [0.1, 0.0, 0.3],
 [0.1, 0.1, 0.2],
 [0.1, 0.2, 0.1],
 [0.1, 0.3, 0.0],
 [0.2, 0.0, 0.2],
 [0.2, 0.1, 0.1],
 [0.2, 0.2, 0.0],
 [0.3, 0.0, 0.1],
 [0.3, 0.1, 0.0]]

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多