Есть ли способ добавить несколько условий в цикл for? - PullRequest
2 голосов
/ 21 июля 2011
    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

Я новичок в программировании и изучаю Python. Код выше дает ошибки.Любое предложение .?.

Ответы [ 3 ]

4 голосов
/ 21 июля 2011

Вы должны использовать вложенные циклы:

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

Или даже лучше:

import itertools

for a, b, c in itertools.product(range(1, n + 1), repeat=3):
    if ...
3 голосов
/ 21 июля 2011

Я думаю, вам следует начинать диапазоны с 0, в противном случае вы получите только ответы, включающие хотя бы один из каждого размера.Вы также можете выполнять меньше работы за компьютером, поскольку знаете, что никогда не будет более 10000 * упаковок из 6 и т. Д. Это может быть большой экономией - для 45 слепков вам нужно всего лишь протестировать 144 случая по сравнению с 97336 * 1002.*

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 дает декартово произведение из 3-х диапазонов.Например

>>> 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)]
1 голос
/ 21 июля 2011

Если вы хотите иметь значения из нескольких последовательностей в цикле for, тогда вы можете использовать zip, например:

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

Конечно, повторять тот же диапазон - пустая трата времени, но, судя по названию вашего поста, я предполагаю, что использование того же диапазона является лишь примером.

...