Как сделать глубокий вложенный цикл в Python - PullRequest
0 голосов
/ 25 декабря 2018

По какой-то причине я рисую бланк прямо сейчас.Я хочу составить список, который представляет все возможные результаты за последнюю неделю футбола (всего 16 игр).

Должно быть 2 ^ 16 (65536) результатов, исключая сценарии ничьей.Я знаю, что мог бы просто сделать 16 вложенных для циклов с длиной диапазона 2 в каждом цикле, но должен быть лучший способ.

Я хочу, чтобы каждая игра была по существу списком (0 для проигрыша, 1за победу).

Пример результата в списке длиной 65536:

Индекс 0 (16 игр всего):

[[0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1]]

Следующий индекс может выглядеть так же (например), за исключением того, что последний перевернут

[[0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1], [0,1],[0,1], [0,1], [0,1], [1,0]]

Каждый индекс - это уникальный результат недели.

Любойидеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Вы правы, что есть лучший способ сделать это.Вы можете просто использовать функцию product из itertools, которая в точности соответствует тому, что вы пытаетесь сделать. документы на него здесь .

Это так же просто, как:

>>> from itertools import product
>>> outcomes = list(product(range(2), repeat=16))
>>> print(len(outcomes))
65536
>>> print(outcomes[0])
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
>>> print(outcomes[10000])
(0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0)

Вы заметите, что это не дает вам пары [0, 1], которые выожидали, но, очевидно, поскольку в каждой игре только две команды, просто считайте, что число, показанное на каждой позиции, является счетом первой команды, и вы можете сделать вывод, что оценка другой команды противоположна.

0 голосов
/ 25 декабря 2018

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

Вот код, который работает:

for i in range(65536):
    s = "{:016b}".format(i)
    l = [[1, 0] if ch == "1" else [0, 1] for ch in s]
    print(s)

В первой строке перечислены все целые числа от 0 до 65535.
Во второй строке преобразовывается число в 16-значное двоичное число (например, 0101010101010101)
В третьей строке каждая цифра отображается на [0, 1]или [1, 0] и создает нужный список.

...