Многофункциональный продукт в Python - PullRequest
1 голос
/ 27 апреля 2010

Есть ли лучший способ сделать это:

perms = product(range(1,7),range(1,7),range(1,7))

чтобы я мог выбрать, сколько диапазонов я использую? Я хочу, чтобы это было эквивалентно этому, но масштабируемо.

def dice(num)
    if num == 1:
        perms = ((i,) for i in range(1,7))
    elif num == 2:
        perms = product(range(1,7),range(1,7))
    elif num == 3:
        perms = product(range(1,7),range(1,7),range(1,7))
    #... and so on

но я знаю, что должен быть лучший способ. Я использую это для подсчета результатов игры в кости. Актуальный код

def dice(selection= lambda d: d[2]):   
    perms = itertools.product(range(1,7),range(1,7),range(1,7))      
    return collections.Counter(((selection(sorted(i)) for i in perms)))

, где я могу вызвать его с помощью различных селекторов, например sum(d[0:2]) для суммы младших 2 костей или d[1] для получения средних костей.

Ответы [ 2 ]

10 голосов
/ 27 апреля 2010

Да. Используйте аргумент ключевого слова repeat:

perms = product(range(1, 7), repeat=3)

Подробнее см. документы .

0 голосов
/ 27 апреля 2010

Я думаю

perms = itertools.product(*([xrange(1,7)]*num))

должно работать на вас.

...