Python, распечатайте ключи сумм элементов каждой возможной комбинации в словаре - PullRequest
0 голосов
/ 29 августа 2018

Ниже создаются строки для итерации и суммирования всех возможных комбинаций элементов в словаре. Например, если длина словаря равна 5, я хочу получить сумму любых 2 элементов, любых 3 элементов, любых 4 элементов.

import itertools

di = {'a': 1, 'b': 2, 'c': 34, 'd': 24}

dict_len = range(len(di)-2, len(di))

for l in dict_len:
    d_values = list(itertools.combinations(di.values(), l))
    for d in d_values:
        print d

Выход:

35
3
25
36
58
26
37
59
27
60

Как можно распечатать ключи значений? как:

a + c = 35
a + b = 3
a + d = 25
b + c = 36
c + d = 58
b + d = 26
a + b + c =37
a + c + d =59
a + b + d =27
c + b + d =60

Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Чтобы получить желаемый результат (как указано в вопросе):

import itertools

di = {'a': 1, 'b': 2, 'c': 34, 'd': 24}

dict_len = range(len(di)-2, len(di))

for l in dict_len:
    d_values = list(itertools.combinations(di.values(), l))
    d_keys = list(itertools.combinations(di.keys(), l))
    for i in range(len(d_values)):
        print " + ".join(d_keys[i]), "=", sum(d_values[i])

Выход:

a + c = 35
a + b = 3
a + d = 25
c + b = 36
c + d = 58
b + d = 26
a + c + b = 37
a + c + d = 59
a + b + d = 27
c + b + d = 60
0 голосов
/ 29 августа 2018

Интересная проблема. Вы можете сделать это так:

import itertools

di = {'a': 1, 'b': 2, 'c': 34, 'd': 24}

for n in range(2, len(di)):
  for pairs in itertools.combinations(di.items(), n):
      keys, values = zip(*pairs)  # Note 1
      print("{} = {}".format(' + '.join(keys), sum(values)))

, что приводит к

a + b = 3
a + c = 35
a + d = 25
b + c = 36
b + d = 26
c + d = 58
a + b + c = 37
a + b + d = 27
a + c + d = 59
b + c + d = 60

Примечания:

  1. Обратите внимание на конструкцию zip(*iterable), которая меняет порядок группировки. Например, вам потребуется от [('foo', 1), ('bar', 2)] до [('foo', 'bar'), (1, 2)], что эффективно сгруппирует keys и values вместе.
0 голосов
/ 29 августа 2018

Вы могли бы что-то вроде этого:

di = {'a': 1, 'b': 2, 'c': 34, 'd': 24}

dict_len = range(len(di)-2, len(di))

for l in dict_len:
    d_values = list(itertools.combinations(di.values(), l))
    d_keys =  list(itertools.combinations(di.keys(), l))
    for d,k in zip(d_values,d_keys):
        print(k,sum(d))

, который генерирует вывод:

('a', 'b') 3
('a', 'c') 35
('a', 'd') 25
('b', 'c') 36
('b', 'd') 26
('c', 'd') 58
('a', 'b', 'c') 37
('a', 'b', 'd') 27
('a', 'c', 'd') 59
('b', 'c', 'd') 60
...