我需要为一款名为TicTackToe.py的游戏打印一个3 x 3阵列.我知道我们可以使用水平或垂直方式从列表中打印内容
listA=['a','b','c','d','e','f','g','h','i','j']
# VERTICAL PRINTING
for item in listA:
print item
Run Code Online (Sandbox Code Playgroud)
输出:
a
b
c
Run Code Online (Sandbox Code Playgroud)
要么
# HORIZONTAL PRINTING
for item in listA:
print item,
Run Code Online (Sandbox Code Playgroud)
输出:
a b c d e f g h i j
Run Code Online (Sandbox Code Playgroud)
如何打印两者的混合,例如打印3x3盒子
a b c
d e f
g h i
Run Code Online (Sandbox Code Playgroud)
Pet*_*ood 23
您可以使用enumerate这些项目,并且每隔三个项目仅打印一个换行符:
for index, item in enumerate('abcdefghij', start=1):
print item,
if not index % 3:
print
Run Code Online (Sandbox Code Playgroud)
输出:
a b c
d e f
g h i
j
Run Code Online (Sandbox Code Playgroud)
enumerate默认情况下从零开始计数,所以我设置了start=1.
正如@arekolek评论的那样,如果您正在使用Python 3,或者已经为Python 2导入了未来的打印功能,您可以指定一次性结束的行,而不是上面的两个步骤:
for index, item in enumerate('abcdefghij', start=1):
print(item, end=' ' if index % 3 else '\n')
Run Code Online (Sandbox Code Playgroud)
Pad*_*ham 11
您可以使用石斑鱼配方中的逻辑:
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
Run Code Online (Sandbox Code Playgroud)
如果您不想丢失元素,请使用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=""))))
Run Code Online (Sandbox Code Playgroud)
不同之处在于它保留了j:
a b c
d e f
g h i
j
Run Code Online (Sandbox Code Playgroud)
您可以将逻辑放在一个函数中,并在想要打印时调用它,传入您想要的任何值.
from itertools import izip_longest
def print_matrix(m,n, fill):
print( "\n".join(map(" ".join, izip_longest(*[iter(m)] * n, fillvalue=fill))))
Run Code Online (Sandbox Code Playgroud)
或者没有itertools只是chunk和join,你也可以使用separg作为分隔符:
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)))))
Run Code Online (Sandbox Code Playgroud)
您只需要传递列表和每行的大小:
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
Run Code Online (Sandbox Code Playgroud)
一个简单的方法是使用模运算符:
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
Run Code Online (Sandbox Code Playgroud)
正如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],
Run Code Online (Sandbox Code Playgroud)
此处给出的两个答案的替代方法是使用为您进行格式化的内容,例如numpy。这通常是您可能不希望的外部依赖关系,但是如果您已经将内容存储在网格/矩阵中,则可以合理地选择:
from numpy import array
str(array(listA).reshape((3,3)))
Run Code Online (Sandbox Code Playgroud)
将其放入数组中,将其重塑为您喜欢的(兼容)形状,然后使其成为字符串。再直观不过了!