我需要为一款名为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
答案 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太棒了。