Что делает добавление второго параметра в цикл for с вложенным enumerate()?

Я снова пробую себя на Python и хочу создать текстовый Ticktacktoe.

В настоящее время я работаю над макетом с 0, представляющим пустые места в играх, и числами вверху и слева для координат. Вот что у меня есть на данный момент:

game = [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],]

print('   0  1  2')

for row in enumerate(game):
    print(row)

который выводит это:

     0  1  2
(0, [0, 0, 0])
(1, [0, 0, 0])
(2, [0, 0, 0])

Проблема в том, что я хочу, чтобы это выглядело так:

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

Теперь я нашел способ, добавив «count» в цикл for. Но я вообще не понимаю зачем. Поиск документации Python не помог. Почему это происходит? Почему это избавляет от скобок и запятых?

game = [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],]

print('   0  1  2')

for count, row in enumerate(game):
    print(count, row)

Редактировать: я думаю, что теперь понимаю. Поскольку enumarate() возвращает индекс, и все, что в основном происходит, это то, что я присвоил count индексу и строке в основном значение? И именно поэтому теперь есть скобки, так как print печатает более 1 переменной с использованием пробела? Не могли бы вы это подтвердить?


person itsolidude    schedule 19.02.2020    source источник


Ответы (3)


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

person lumbric    schedule 19.02.2020

for row in enumerate(game):

Это напечатает row, который является кортежем. Кортежи печатаются в формате (item1, item2, ...)

Пример:

>>> row = (5, [0,0,0])
>>> print(row)
(5, [0,0,0]) 

for count, row in enumerate(game): Здесь результат распакован. То, что было кортежем, теперь разделено на count и row. print может принимать переменное количество аргументов и по умолчанию разделяет их пробелом.

Пример:

>>> count = 5
>>> row = [0,0,0]
>>> print(count, row)
5 [0,0,0]

Вложенные списки

Вложенный список — это список, который содержит другие списки. Простой пример

nested = [[0,1,2], [3,4,5]]

Вы можете распаковать вложенный список (или вообще любой список)

list012, list345 = nested

Это то, что делает for count, row in enumerate(game):.

enumerate(game) возвращает кортеж: счетчик и обычный объект. Мы можем сравнить это так:

my_list = [10,20,30]
for i in my_list:
    print i    # prints 10 20 30
for i in enumerate(my_list):
    print i    # prints (0,10) (1,20) (2,30)
person Michael Bianconi    schedule 19.02.2020
comment
Не могли бы вы уточнить, возможно, вложенный список? Кажется, я начинаю это понимать. Не могли бы вы подробнее остановиться на том, что вы подразумеваете под деструктуризацией? - person itsolidude; 19.02.2020
comment
Обновлен мой ответ - person Michael Bianconi; 19.02.2020

enumerate(items) возвращает список кортежей числа и вашего элемента, где число увеличивается на единицу для каждого нового элемента в списке (подсчет). В этом случае enumerate возвращает следующие кортежи:

{0, [0, 0, 0]}, {1, [0, 0, 0]}, {2, [0, 0, 0]}

Используя второе имя переменной в цикле for, вы деструктурируете кортеж на count и row. Принимая во внимание, что раньше вы давали только 1 имя переменной, поэтому переменной был назначен весь кортеж.

person LLSv2.0    schedule 19.02.2020
comment
Я понимаю, что он деструктурируется, но во что? count и row относятся к какой части списка? Или я неправильно это понимаю? Не могли бы вы рассказать о другом примере с вложенными списками, как в моем коде? - person itsolidude; 19.02.2020
comment
@itsolidude кортеж деструктурируется. - person juanpa.arrivillaga; 19.02.2020