如何在python中打印3x3数组?

时间:2016-03-09 22:19:05

标签: python

我需要为一款名为TicTackToe.py的游戏打印一个3 x 3阵列。我知道我们可以使用

以水平或垂直方式从列表中打印内容
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

7 个答案:

答案 0 :(得分:23)

您可以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')

答案 1 :(得分:11)

您可以使用grouper recipe

中的逻辑
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作为填充值:

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,你也可以使用sep arg作为分隔符:

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

答案 2 :(得分:8)

一种简单的方法是使用模运算符:

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

正如Peter Wood所指出的,您可以使用枚举器运算符来避免计数变量:

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],

答案 3 :(得分:5)

这里给出的两个答案的替代方法是使用为你做格式化的东西,比如numpy。这是您可能不想要的外部依赖,但如果您已经将内容存储在网格/矩阵中,那么它可能是一个合理的选择:

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

将它放入一个数组中,将其重塑为您喜欢的(兼容)形状,并使其成为一个字符串。无法更直观!

答案 4 :(得分:4)

您可以使用字符串对象的格式方法:

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])

答案 5 :(得分:1)

一个未提及的方法:以数学方式获取列表的切片,并通过列表的切片获取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=" ")

答案 6 :(得分:0)

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太棒了。