假设我有一个如下所示的数据表:
对于索引级别 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 的唯一列加法结果)
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
未排序,但值可能按顺序出现