Как печатать массив 3x3 в python?

Мне нужно напечатать массив 3 x 3 для игры под названием TicTackToe.py. Я знаю, что мы можем печатать материал из списка горизонтальным или вертикальным способом, используя

listA=['a','b','c','d','e','f','g','h','i','j']
# VERTICAL PRINTING 
for item in listA:
        print item

Вывод:

a
b
c

или

# HORIZONTAL  PRINTING
for item in listA:
        print item,

Выход:

a b c d e f g h i j

Как я могу напечатать смесь обоих, например. печать коробки 3x3 как

a b c
d e f
g h i

Ответы

Ответ 1

Вы можете enumerate элементы и напечатать новую строку только для каждого третьего элемента:

for index, item in enumerate('abcdefghij', start=1):
    print item,
    if not index % 3:
        print

Вывод:

a b c
d e f
g h i
j

enumerate начинает отсчет с нуля по умолчанию, поэтому я устанавливаю start=1.

Как комментарий @arekolek, если вы используете Python 3 или импортировали функцию печати из будущего для Python 2, вы можете указать строку, заканчивающуюся всего за один раз, вместо двух шагов выше:

for index, item in enumerate('abcdefghij', start=1):
    print(item, end=' ' if index % 3 else '\n')

Ответ 2

Вы можете использовать логику из рецепта grouper:

listA=['a','b','c','d','e','f','g','h','i','j']

print("\n".join(map(" ".join, zip(*[iter(listA)] * 3))))
a b c
d e f
g h i

Если вы не хотите терять элементы, используйте izip_longest с пустой строкой как fillvalue:

listA=['a','b','c','d','e','f','g','h','i','j']
from itertools import izip_longest

print("\n".join(map(" ".join, izip_longest(*[iter(listA)] * 3,fillvalue=""))))

Что отличается тем, что он поддерживает j:

a b c
d e f
g h i
j  

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

from itertools import izip_longest

def print_matrix(m,n, fill):
    print( "\n".join(map(" ".join, izip_longest(*[iter(m)] * n, fillvalue=fill))))

Или без itertools просто chunk и join, вы также можете использовать arg sep для использования в качестве разделителя:

def print_matrix(m,n, sep):
    print( "\n".join(map("{}".format(sep).join, (m[i:i+n] for i in range(0, len(m), n)))))

Вам просто нужно передать список и размер для каждой строки:

In [13]: print_matrix(listA, 3, " ")
a b c
d e f
g h i
j

In [14]: print_matrix(listA, 3, ",")
a,b,c
d,e,f
g,h,i
j

In [15]: print_matrix(listA, 4, ",")
a,b,c,d
e,f,g,h
i,j

In [16]: print_matrix(listA, 4, ";")
a;b;c;d
e;f;g;h
i;j

Ответ 3

Простым подходом было бы использовать оператор modulo:

listA=['a','b','c','d','e','f','g','h','i','j']

count = 0

for item in listA:
    if not count % 3:
        print
    print item,
    count += 1

Как отметил Питер Вуд, вы можете использовать оператор перечисления, чтобы избежать переменной count:

listA=['a','b','c','d','e','f','g','h','i','j']

listB = enumerate(listA)
for item in listB:
    if not item[0] % 3:
        print
    print item[1],

Ответ 4

Альтернативой двум приведенным здесь ответам является использование чего-то, что делает форматирование для вас, например numpy. Это внешняя зависимость, которую вы, возможно, не хотите вообще, но если вы уже сохраняете вещи в сетках/матрицах, это может быть логичным выбором:

from numpy import array
str(array(listA).reshape((3,3)))

Поместите его в массив, измените его в своей любимой (совместимой) форме и сделайте его строкой. Не может быть более интуитивным!

Ответ 5

Вы можете использовать метод форматирования строкового объекта:

for i in range(3):
    print "{} {} {}".format(*listA[3*i:3*i+3])

Кроме того, вместо умножения индекса на 3 на каждой итерации вы можете просто выполнить три элемента из списка:

for i in range(0, len(listA), 3):
    print "{} {} {}".format(*listA[i:i+3])

Ответ 6

Один из методов, которые не были упомянуты: Получить фрагмент списка математически и print срезом списка.

В Python 2.x:

listA=['a','b','c','d','e','f','g','h','i','j']
val = (len(listA) + 2) // 3
for i in range(val):
    print(' '.join(listA[i*3:(i+1)*3]))

В Python 3.x:

listA=['a','b','c','d','e','f','g','h','i','j']
val = (len(listA) + 2) // 3
for i in range(val):
    print(*listA[i*3:(i+1)*3], sep=" ")

Ответ 7

print ''.join(' '*(n%3!=0)+l+'\n'*(n%3==2) for n,l in enumerate(listA))

a b c
d e f
g h i
j

Python потрясающий.