计算添加 (1+1) X 列的所有组合,其中一列始终为常数

问题描述 投票:0回答:1

假设我有一个如下所示的数据表:

base + additive pricing

对于索引级别 1 和 2 的每个组合 - 可以为客户分配一个价格,让他们获得价值基列 + a、b、c、d、e 列的任意组合的添加...包括 0 添加,最大。 5 个添加,并且没有重复的列添加(请参阅下面我的意思的示例)... 即组合/排列示例:

    Permutation1 = value_base

    Permutation2 = value_base  + value_add_a + value_add_b

    Permutation3 = value_base  + value_add_c

    Permutation4 = value_base  + value_add_c + value_add_d + value_add_e

    Permutation5 = value_base  + value_add_b + value_add_c + value_add_d

    Permutation6 = value_base  + value_add_a + value_add_d + value_add_e

    Permutation7 = value_base  + value_add_b + value_add_d + value_add_e

    Permutation8 = value_base  + value_add_e

等等...

这个例子不会发生:

    Permutation5 = value_base  + value_add_c + value_add_c + value_add_e

因为 _c 出现不止一次!

我也不想要的是“重复”组合 - 添加以相同的顺序发生: IE。这个:

    Permutation4 = value_base  + value_add_c + value_add_d + value_add_e

给了我与此相同的结果:

    Permutation4 = value_base  + value_add_c + value_add_e + value_add_d

所以我不想要这个:)

我想用 python 编写这个代码

目前陷入困境,无法想出可以保持基数恒定的解决方案..

import itertools
a = list(itertools.permutations([2, 3, 4, 5, 6]))
b = [1]
c = [list(permutation) + b for permutation in a]
print(c)

已经尝试过像这样看something - 其中b可以保持不变,但是这个解决方案的问题是组合可以重复并且添加的长度始终为6 - 在我的解决方案中长度(列数)加在一起)可以是 1、2、3、4、5 或 6(给定所有可能的组合 - 请记住 b 必须是常数,并且 b 只能是长度为 1 的唯一列加法结果)

python combinations permutation
1个回答
0
投票

您可能正在寻找

itertools.combinations
,而不是
.permutations

from itertools import combinations

def calculate(columns, base, spread=(0,5)):
    results = set()
    if spread[0] == 0:  # special case zero columns
        results.add(base)
    a, b = spread  # unpack to increment end in range
    for column_count in range(a, b+1):
        values = set(base + sum(c) for c in combinations(columns, column_count))
        results.update(values)
    return results
>>> calculate([1,2,3], 0)
{0, 1, 2, 3, 4, 5, 6}
>>> calculate([1,2,3], 0, spread=(1,2))
{1, 2, 3, 4, 5}
>>> calculate([1,2,3,4,5], 0)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
>>> calculate([1,2,3,4,5], 2, spread=(1,2))
{3, 4, 5, 6, 7, 8, 9, 10, 11}

注意

set
未排序,但值可能按顺序出现

© www.soinside.com 2019 - 2024. All rights reserved.