53 votes

Code Python élégant pour le partitionnement entier

J'ai essayé d'écrire du code pour résoudre le problème standard de la partition entière ( Wikipedia ). Le code que j'ai écrit était un gâchis. J'ai besoin d'une solution élégante pour résoudre le problème, car je veux améliorer mon style de codage. Ce n'est pas une question de devoirs.

47voto

Nolen Royalty Points 7344

Bien que cette réponse soit correcte, je recommanderais la réponse de skovorodkin ci-dessous :

 >>> def partition(number):
...     answer = set()
...     answer.add((number, ))
...     for x in range(1, number):
...         for y in partition(number - x):
...             answer.add(tuple(sorted((x, ) + y)))
...     return answer
... 
>>> partition(4)
set([(1, 3), (2, 2), (1, 1, 2), (1, 1, 1, 1), (4,)])

Si vous voulez toutes les permutations (c'est-à-dire (1, 3) et (3, 1)) changez answer.add(tuple(sorted((x, ) + y)) en answer.add((x, ) + y)

13voto

Nico Points 893

J'avais besoin de résoudre un problème similaire , à savoir la partition d'un entier n en d parties non négatives, avec des permutations. Pour cela, il existe une solution récursive simple (voir ici ):

 def partition(n, d, depth=0):
    if d == depth:
        return [[]]
    return [
        item + [i]
        for i in range(n+1)
        for item in partition(n-i, d, depth=depth+1)
        ]


# extend with n-sum(entries)
n = 5
d = 3
lst = [[n-sum(p)] + p for p in partition(n, d-1)]

print(lst)

Sortir:

 [
    [5, 0, 0], [4, 1, 0], [3, 2, 0], [2, 3, 0], [1, 4, 0],
    [0, 5, 0], [4, 0, 1], [3, 1, 1], [2, 2, 1], [1, 3, 1],
    [0, 4, 1], [3, 0, 2], [2, 1, 2], [1, 2, 2], [0, 3, 2],
    [2, 0, 3], [1, 1, 3], [0, 2, 3], [1, 0, 4], [0, 1, 4],
    [0, 0, 5]
]

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