计算排列

时间:2014-12-14 14:18:32

标签: python algorithm python-2.7 permutation

我有一个元组让我们说:

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)?

1 个答案:

答案 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)]