Как печатать массив 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 потрясающий.