我需要为一个名为TicTackToe.py的游戏打印一个3x3数组。我知道我们可以以水平或垂直的方式打印列表中的内容,使用
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
发布于 2016-03-10 06:28: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,只需分块和连接,您也可以使用一个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
发布于 2016-03-10 06:27:06
一种简单的方法是使用模运算符:
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所指出的,您可以使用枚举运算符来避免使用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],
发布于 2016-03-10 06:37:58
这里给出的两个答案的另一种选择是使用可以为您进行格式化的东西,比如numpy。这是一个你一般不想要的外部依赖,但如果你已经在网格/矩阵中存储东西,它可能是一个合乎逻辑的选择:
from numpy import array
str(array(listA).reshape((3,3)))
将其放入数组中,将其重塑为您最喜欢的(兼容的)形状,并使其成为字符串。再直观不过了!
https://stackoverflow.com/questions/35903828
复制相似问题