Обобщая различные методы цикла for в Python - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть следующий код, где я пытаюсь сформировать массив «opt». Здесь я беру три возможных значения 'pos_set' = [1, 2, 3] и аналогичным образом могу расширить это. Но я просто хочу обобщенный код для любого возможного целочисленного значения pos_set.

    opt = []
    if pos_set == 1:
        for j in range(1, n):
            opt.append([j])
    elif pos_set == 2:
        for j in range(1, n):
            for k in range(j+1, n):
                opt.append([j, k])
    elif pos_set == 3:
        for j in range(1, n):
            for k in range(j+1, n):
                for l in range(k+1, n):
                    opt.append([j, k, l])

Для большей ясности я делаю это с целью собрать все возможности, если вы бросаете кубик с n-гранью и продолжаете делать это до тех пор, пока вы продолжаете бросать большие значения.

Например, если вы бросаете последовательность 1-2-6-4, в этом случае после получения 4 после большего нет. 6, вы перестанете катиться. Точно так же, если вы бросаете последовательность 1-2-6-6, в этом случае вы получаете повтор 6, поэтому вы останавливаетесь, потому что он не больше вашего предыдущего броска. Я рассматриваю случаи до того, как меньшее или одинаковое число произойдет, т.е. [1, 2, 6] в обоих случаях.

Если вы, ребята, можете мне помочь, я был бы благодарен.

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

По тому, как вы ответили на вопрос, вы не были уверены, интересовались ли вы просто построением q pos_set или вам нужна помощь с кодом для получения фактического результата, который будет соответствовать вашей цели.

Вот код, который я написал, который будет бросать n-сторонний кристалл (я просто установил его на 100 для демонстрации), но он будет продолжать бросать другой кристалл и добавлять его значение, пока это число не станет равным или меньшим, а затем предыдущий бросок .

Я задержусь на взломе кода, если вам не понадобится и эта часть. Дай мне знать!

import random

die = list(range(1, 100))
temp = [0, 1, 2]
winners = []

while temp[1] > temp[0]:
    temp[0] = random.randint(1, len(die))
    temp[1] = random.randint(1, len(die))
    temp[0] = temp[2]
    if temp[1] > temp[0]:
        winners.append(temp[1])
        temp[2] = temp[1]
    else:
        winners.append(temp[1])
        break

print(winners)
0 голосов
/ 02 сентября 2018

Для этого есть встроенное решение itertools.combinsk:

In [5]: import itertools
In [6]: list(itertools.combinations(range(1,7), 3))
Out[6]:
[(1, 2, 3),
 (1, 2, 4),
 (1, 2, 5),
 (1, 2, 6),
 (1, 3, 4),
 (1, 3, 5),
 (1, 3, 6),
 (1, 4, 5),
 (1, 4, 6),
 (1, 5, 6),
 (2, 3, 4),
 (2, 3, 5),
 (2, 3, 6),
 (2, 4, 5),
 (2, 4, 6),
 (2, 5, 6),
 (3, 4, 5),
 (3, 4, 6),
 (3, 5, 6),
 (4, 5, 6)]
0 голосов
/ 02 сентября 2018

Вы можете использовать следующую рекурсивную функцию:

def f(p, n, i=1):
    if p == 0:
        return [[]]
    return [[j, *l] for j in range(i, n) for l in f(p - 1, n, j + 1)]

так что:

print(f(1, 7))
print(f(2, 7))
print(f(3, 7))

выходы:

[[1], [2], [3], [4], [5], [6]]
[[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 3], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6], [4, 5], [4, 6], [5, 6]]
[[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [1, 5, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6], [2, 5, 6], [3, 4, 5], [3, 4, 6], [3, 5, 6], [4, 5, 6]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...