3 votes

Python - obtenir toutes les sommes possibles d'éléments dans n 1d tableaux

Étant donné un nombre entier n, et un tableau a, je voudrais retourner un tableau avec toutes les valeurs possibles des sommes de a avec lui-même n fois.

Example: n = 3, a = [1, 2, 3, 4, 5, 6]

Output: [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

Le premier élément est de 1+1+1, le second de 1+1+2, etc.

Existe-t-il un moyen élégant de le faire ? J'ai essayé les boucles, mais comme n n'est pas connu à l'avance, je ne sais pas combien de boucles je dois faire.

Merci d'avance

8voto

DeepSpace Points 31729

Générer toutes les combinaisons possibles de 3 éléments, puis les additionner :

from itertools import combinations_with_replacement

n = 3
li = [1, 2, 3, 4, 5, 6]

print([sum(comb) for comb in combinations_with_replacement(li, n)])

# [3, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9, 7, 8, 9, 10, 9, 10, 11, 11, 12, 13, 6, 7, 8, 9, 10, 8, 9, 10, 11, 10, 11, 12, 12, 13, 14, 9, 10, 11, 12, 11, 12, 13, 13, 14, 15, 12, 13, 14, 14, 15, 16, 15, 16, 17, 18]

Puisque vous semblez être intéressé par les sommes uniques, utilisez un ensemble :

print(set(sum(comb) for comb in combinations_with_replacement(li, n)))

# {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}

Notez qu'il n'y a aucune garantie que ces produits seront commandés. Si vous voulez une sortie ordonnée, soyez explicite à ce sujet :

print(sorted(set(sum(comb) for comb in combinations_with_replacement(li, n))))

3voto

Bazingaa Points 7919

Une solution alternative pourrait être d'utiliser itertools.product . Ici, vous générez d'abord des paires de 3 éléments à partir de a puis les additionner. Pour se débarrasser des doublons, on utilise l'ensemble { } et la sommation est faite en utilisant la compréhension de liste. Ici, j'utilise *[a]*n pour le rendre plus général pour toute valeur de n .

import itertools
n = 3
totals = {sum(item) for item in itertools.product(*[a]*n)}
# {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}

Une autre façon lisible de le faire serait d'utiliser une variable lists et le passe ensuite à itertools.product

lists = [a]*n
totals = {sum(item) for item in itertools.product(*lists)}

Pour obtenir toutes les sommes possibles y compris les doublons il suffit d'utiliser [ ] au lieu de { } .

3voto

Ethan Koch Points 249

Cela fonctionnera pour vous et vous donnera un ensemble comme sortie pour assurer des valeurs de somme uniques. n y a peuvent être n'importe quel nombre entier ou liste, respectivement.

import itertools

n = 3
a = [1, 2, 3, 4, 5, 6]
b = [a for _ in range(n)]
sums = set(sum(_b) for _b in itertools.product(*b))

0voto

dobkind Points 376

Une implémentation purement Python :

def comb_sum(arr, n):
    if n == 1:
        [(yield a) for a in arr]
    else:
        for i, a in enumerate(arr):
            [(yield a + b) for b in comb_sum(arr[i:], n-1)]

my_list = [1, 2, 3, 4, 5, 6]
n = 3
sums = set([c for c in comb_sum(my_list, n)])

0voto

Sufiyan Ghori Points 497

En utilisant map y lambda ,

n = 3
a = [1, 2, 3, 4, 5, 6]
print(list(set(map(lambda k:sum(k), combinations_with_replacement(a, n)))))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X