Python - dict中的递归循环

时间:2014-05-07 19:39:29

标签: python recursion dictionary

是否有一种很酷的方式来递归遍历dict以获得总和(值)的所有组合:

我有一个词典{a: 10, b: 20, c:30}

我想找到三人和三人的所有独特组合(价值总和):

e.g。两两

30  # 10 + 20
40  # 10 + 30
50  # 20 + 30
对于三个人来说同样如此:

60 # 10 + 20 + 30

5 个答案:

答案 0 :(得分:3)

对于您提供的示例输入,您可以使用mapsumitertools.combinations的组合:

d = {'a': 10, 'b': 20, 'c':30}

import itertools
print map(sum, itertools.combinations(d.values(), 2))
print map(sum, itertools.combinations(d.values(), 3))

或者,在Python3中:

d = {'a': 10, 'b': 20, 'c':30}

import itertools
print(list(map(sum, itertools.combinations(d.values(), 2))))
print(list(map(sum, itertools.combinations(d.values(), 3))))

打印:

[40, 30, 50]
[60]

答案 1 :(得分:2)

您可以使用itertools.combinations获取所有组合,然后对结果求和。

E.g。

from itertools import combinations

mydict = {'a': 10, 'b': 20, 'c':30}
twos = [sum(c) for c in combinations(mydict.values(), 2)]
threes = [sum(c) for c in combinations(mydict.values(), 3)]
print twos
print threes

答案 2 :(得分:1)

您可以使用itertools,如下所示:

import itertools
mydict = {'a': 10, 'b': 20, 'c':30}
result = [mydict[x] + mydict[y] for x, y in itertools.combinations(d, 2)]

答案 3 :(得分:0)

注意:上面使用combinations的解决方案更好! 但无论如何我会保留这个。

from itertools import permutations
data = {'a': 10, 'b': 20, 'c':30}

for key_perm in permutations(data.keys(), 2):
  print ' + '.join(key_perm), '=', sum(data[k] for k in key_perm)

打印:

a + c = 40
a + b = 30
c + a = 40
c + b = 50
b + a = 30
b + c = 50

但是你可能只想要不同的总和,因为整数的加法是可交换的。套装来救援。

for key_perm in set(tuple(sorted(perm)) for perm in permutations(data.keys(), 2)):
  print ' + '.join(key_perm), '=', sum(data[k] for k in key_perm)

打印:

b + c = 50
a + b = 30
a + c = 40

需要使用上面的tuple,因为set()只接受不可变项,sorted()返回可变list

答案 4 :(得分:0)

电源设置:

d={'a': 10, 'b': 20, 'c':30}
def power_set(items):
    n = len(items)
    for i in xrange(2**n):
        combo = []
        for j in xrange(n):
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        yield combo
data= [sum(x) for x in  list(power_set(d.values())) if len(x)>1]
In [10]: data
Out[10]: [40, 30, 50, 60]