Три значения для цикла for - PullRequest
0 голосов
/ 29 июня 2018

Я бы хотел, чтобы три значения увеличивались на разных скоростях. Моя общая цель - подражать этому шаблону:

0,0,   0
0,1,   1
0,2,   2
1,0,   3
1,1,   4
1,2,   5
2,0,   6
2,1,   7
2,2,   8

Первые два числа просты. Я бы решил это так:

for x in range(3):
    for y in range(3):
        print(x, y)
>>> 0 0
>>> 0 1
>>> 0 2
>>> 1 0
>>> 1 1
>>> 1 2
>>> 2 0
>>> 2 1
>>> 2 2

Это шаблон, который я хочу.

Вопрос в том, как мне увеличивать третье число на единицу каждый раз, при этом оставляя первые два числа такими же, как они?

Как я могу сделать приращение третьего числа на единицу каждый раз, когда идет цикл for?

Ответы [ 7 ]

0 голосов
/ 29 июня 2018

одна переменная. один цикл.

for i in range(9):
  print(i // 3, i % 3, i)

// - деление по полу, а % - модуль (остаток, в большинстве случаев)

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

0 голосов
/ 02 июля 2018

Для меня это выглядит более естественно :)

x_range = 3  
y_range = 3  
for x in range( x_range*y_range ):  
    print(x // x_range, x % x_range, x)  

Подобно тому, что написал cwharris.

0 голосов
/ 29 июня 2018

Вы можете просто использовать переменную count для этого

count = 0
for x in range(3):
    for y in range(3):
        print(x, y, ' ' ,count) # use ' ' for making exact look what OP asked..lol
        count = count + 1
0 голосов
/ 29 июня 2018

Поскольку у нас есть все эти ответы, я выложу самый простой

count = 0
for x in range(3):
    for y in range(3):
        print(x, y, count)
        count += 1
0 голосов
/ 29 июня 2018

Попробуйте это:

for x in range(3):
    for y in range(3):
        print(x, y, x * 3 + y) # Python 3.x
        print x, y, x * 3 + y # Python 2.x

Надеюсь, это поможет.

0 голосов
/ 29 июня 2018

Третье число подсчитывает, сколько всего у вас было итераций. Для каждого приращения в X он получает общий размер цикла Y, и к этому вам нужно добавить значение Y:

X_SIZE = 3
Y_SIZE = 3
for x in range(X_SIZE):
    for y in range(Y_SIZE):
        print(x, y, x * Y_SIZE + y)
0 голосов
/ 29 июня 2018

Для этого вам не нужны вложенные циклы. Вы можете использовать itertools.product для получения первых двух чисел и enumerate для получения последнего.

from itertools import product

for i, (u, v) in enumerate(product(range(3), repeat=2)):
    print(u, v, i)

выход

0 0 0
0 1 1
0 2 2
1 0 3
1 1 4
1 2 5
2 0 6
2 1 7
2 2 8

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

enumerate, вероятно, еще более полезен: он позволяет перебирать последовательность или любую итерацию и возвращает элементы итерации, а также индексный номер. Поэтому, когда вам нужно перебрать список, но вам также нужны элементы списка и их индексы, более эффективно использовать enumerate, чтобы получить их оба одновременно, а не цикл, который использует range для создания индекса. а затем с помощью индекса выбрать элемент списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...