2 votes

Existe-t-il un moyen d'ajouter plusieurs conditions dans une boucle for ?

    n=int(raw_input('enter the number of mcnuggets you want to buy : ')) #total number of               mcnuggets you want yo buy
    for a in range(1,n) and b in range(1,n) and c in range(1,n) :
        if (6*a+9*b+20*c==n):
            print 'number of packs of 6 are ',a
            print 'number of packs of 9 are ',b
            print 'number of packs of 20 are',c

Je suis nouveau dans la programmation et j'apprends Python. Le code ci-dessus donne des erreurs. Une suggestion ?

5voto

Yossi Points 4922

Vous devez utiliser des boucles imbriquées :

for a in range(1, n):
    for b in range(1, n):
        for c in range(1, n):
            if ...

Ou encore mieux :

import itertools

for a, b, c in itertools.product(range(1, n + 1), repeat=3):
    if ...

3voto

gnibbler Points 103484

Je pense que vous devriez commencer les plages à partir de 0, sinon vous n'obtiendrez que des réponses qui incluent au moins une de chaque taille. Vous pouvez également faire moins de travail pour l'ordinateur puisque vous savez qu'il n'y aura jamais plus de n/6 paquets de 6 requis, etc. Cela peut représenter une économie importante - pour 45 pépites, vous ne devez tester que 144 cas au lieu de 97336.

from itertools import product
n=int(raw_input('enter the number of mcnuggets you want to buy : ')) #total number of mcnuggets you want to buy
for a,b,c in product(range(n//6+1), range(n//9+1), range(n//20+1)) :
    if (6*a+9*b+20*c==n):
        print 'number of packs of 6 are ',a
        print 'number of packs of 9 are ',b
        print 'number of packs of 20 are',c

itertools.product donne le produit cartésien des 3 gammes. Par exemple

>>> from itertools import product
>>> list(product(range(3),range(4),range(5)))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 2, 4), (0, 3, 0), (0, 3, 1), (0, 3, 2), (0, 3, 3), (0, 3, 4), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 0, 4), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 3, 0), (1, 3, 1), (1, 3, 2), (1, 3, 3), (1, 3, 4), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 0, 4), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 1, 4), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 0), (2, 3, 1), (2, 3, 2), (2, 3, 3), (2, 3, 4)]

1voto

cdarke Points 8020

Si vous voulez avoir des valeurs provenant de plusieurs séquences dans une for alors vous pouvez utiliser zip par exemple :

for (a,b,c) in zip(xrange(1,n), xrange(1,n), xrange(1,n)) :
    ....

Bien sûr, c'est un gaspillage de répéter la même gamme, mais à en juger par le titre de votre message, je suppose que l'utilisation de la même gamme n'est qu'un exemple.

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