我有一个元组让我们说:
my_tuple = ((1,2), 10)
和字典:
diction = {1:(1,2,3,4,5,6,7,8,9), 2:(1,2,3,4,5,6,7,8,9), 3:(1,2,3,4,5,6,7,8,9)}
元组的第一个元素表示一些变量,每个变量都可以赋值为1,...,9(根据字典)。
如何计算这些变量的所有排列(不重复)。 我唯一的限制是我希望变量的值总和为10.
例如:
(var1) = 9
(var2) = 1
所以(9,1)总和为10,是有效的排列。
我所尝试的是:
lst = []
first_var = my_tuple[0][0]
sec_var = my_tuple[0][1]
for i in diction[first_var]:
for j in diction[sec_var]:
if i != j:
if (i + j) == my_tuple[1]:
lst.append((i,j))
我的问题是带有变量的元组并不总是相同的大小(在这种情况下为2)。它可能有3个或4个变量,因此上面的循环不起作用。
有没有什么方法可以计算更一般情况下的排列?例如,((1,2,3),20)?
答案 0 :(得分:0)
使用迭代器:
def solve(d, target, total, keys, avoid):
if total <= target: # omit this check if values can be negative
if keys:
k = keys[0]
for v in d[k]:
if not (v in avoid):
for s in solve(d, target, total+v, keys[1:], avoid.union([v]) ):
yield s + [(k,v)]
elif target == total:
yield []
def test1():
d = {'a':(1,2,3), 'b':(4,5), 'c':(1,3,5) }
for s in solve(d, 10, 0, "abc", set([])):
print s
def test2():
d = {'a':(1,2,3), 'b':(1,2,3), 'c':(1,2,3) }
for s in solve(d, 6, 0, "abc", set([])):
print s
test1的输出:
[('c', 5), ('b', 4), ('a', 1)]
[('c', 3), ('b', 5), ('a', 2)]
test2的输出:
[('c', 3), ('b', 2), ('a', 1)]
[('c', 2), ('b', 3), ('a', 1)]
[('c', 3), ('b', 1), ('a', 2)]
[('c', 1), ('b', 3), ('a', 2)]
[('c', 2), ('b', 1), ('a', 3)]
[('c', 1), ('b', 2), ('a', 3)]