2017-01-13 2 views
-4

В Python я пытаюсь добавить все различные комбинации элементов в список N списков, где N - это переменная. В частности, я работаю со списком, содержащим N копий списка [1, 2, 3, 4, 5, 6].Сумма всей возможной комбинации элементов в списке

Итак, давайте предположим, что N = 3. Я хочу, чтобы цикл через первый список, добавив:

6 + 6 + 6 
5 + 6 + 6 
... 
1 + 6 + 6` 

затем увеличивает второй парень один раз и начать добавлять:

6 + 5 + 6 
5 + 5 + 6 
... 
1 + 1 + 1 # ultimately to 

после я, конечно, увеличиваю третий парень. Этот конкретный пример можно сделать с помощью трех вложенных циклов, но, конечно, мне нужно изменить число циклов. Я искал в Интернете и этот форум ответы и не мог понять, что я должен делать. Люди говорили использовать рекурсивные функции, но я даже не слышал об этом, пока не посмотрел. Так что это трудно понять.

+1

Что вы пробовали, вы можете показать нам свои попытки? Может быть, мы сможем помочь вам исправить их. – MooingRawr

+0

SO не является ни кодовым письмом, ни учебным сервисом. Обзор [ask]. – jonrsharpe

+0

Используйте ['itertools.product'] (https://docs.python.org/3/library/itertools.html#itertools.product). 'list (map (sum, product ([1,2,3,4,5,6], repeat = n)))' –

ответ

0

Для того, чтобы достичь этого, вы можете использовать itertools.product как:

from itertools import product 
my_list = [1, 2, 3, 4, 5, 6] 
N=3 

#       value of `N` v 
for s in product(my_list[::-1], repeat=N): 
    print '{} : {}'.format(s[::-1], sum(s)) 
    #   No need to reverse here^
    #   since sum(s[::-1]) and sum(s) will give same result 

, который будет печатать:

# (combination) : sum 
(6, 6, 6) : 18 
(5, 6, 6) : 17 
(4, 6, 6) : 16 
(3, 6, 6) : 15 
(2, 6, 6) : 14 
(1, 6, 6) : 13 
... 
(6, 1, 1) : 8 
(5, 1, 1) : 7 
(4, 1, 1) : 6 
(3, 1, 1) : 5 
(2, 1, 1) : 4 
(1, 1, 1) : 3 

Если вы просто хотите сохранить значение в list, вы можете использовать список понимание выражение как:

>>> [sum(s) for s in product(my_list[::-1], repeat=3)] 
[18, 17, 16, 15, 14, 13, 17, 16, 15, 14, 13, 12, 16, 15, 14, 13, 12, 11, 15, 14, 13, 12, 11, 10, 14, 13, 12, 11, 10, 9, 13, 12, 11, 10, 9, 8, 17, 16, 15, 14, 13, 12, 16, 15, 14, 13, 12, 11, 15, 14, 13, 12, 11, 10, 14, 13, 12, 11, 10, 9, 13, 12, 11, 10, 9, 8, 12, 11, 10, 9, 8, 7, 16, 15, 14, 13, 12, 11, 15, 14, 13, 12, 11, 10, 14, 13, 12, 11, 10, 9, 13, 12, 11, 10, 9, 8, 12, 11, 10, 9, 8, 7, 11, 10, 9, 8, 7, 6, 15, 14, 13, 12, 11, 10, 14, 13, 12, 11, 10, 9, 13, 12, 11, 10, 9, 8, 12, 11, 10, 9, 8, 7, 11, 10, 9, 8, 7, 6, 10, 9, 8, 7, 6, 5, 14, 13, 12, 11, 10, 9, 13, 12, 11, 10, 9, 8, 12, 11, 10, 9, 8, 7, 11, 10, 9, 8, 7, 6, 10, 9, 8, 7, 6, 5, 9, 8, 7, 6, 5, 4, 13, 12, 11, 10, 9, 8, 12, 11, 10, 9, 8, 7, 11, 10, 9, 8, 7, 6, 10, 9, 8, 7, 6, 5, 9, 8, 7, 6, 5, 4, 8, 7, 6, 5, 4, 3] 
+0

Спасибо, это именно то, что мне нужно. Я очень ценю ответ. – ZachR

0

Для решения этой проблемы вы можете использовать itertools.combinations_with_replacement.

In []: from itertools import combinations_with_replacement 
In []: for combination in combinations_with_replacement(range(1, 7), 3): 
      print("Combination: ", combination, " Sum: ", sum(combination)) 
    ....:  
Combination: (1, 1, 1) Sum: 3 
Combination: (1, 1, 2) Sum: 4 
Combination: (1, 1, 3) Sum: 5 
Combination: (1, 1, 4) Sum: 6 
Combination: (1, 1, 5) Sum: 7 
Combination: (1, 1, 6) Sum: 8 
. 
. 
. 
Combination: (4, 5, 6) Sum: 15 
Combination: (4, 6, 6) Sum: 16 
Combination: (5, 5, 5) Sum: 15 
Combination: (5, 5, 6) Sum: 16 
Combination: (5, 6, 6) Sum: 17 
Combination: (6, 6, 6) Sum: 18 

Если вы хотите сохранить суммы в list, вы можете использовать список понимание как:

list_of_sums = [sum(combination) for combination in combinations_with_replacement(range(1, 7), 3)] 
+0

Это тоже сработало бы для меня. Спасибо. – ZachR

Смежные вопросы