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

Smp*_*e_V 15 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
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)

  • 令人惊讶的是,有特定的"食谱"(如Padraic所示),但我认为你的道路要好得多 - 因为**你的代码很简单,它的效果显而易见**甚至是Python新手(也就是说,没有知识)罕见?)进口). (2认同)

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)


Mae*_*cky 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
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)

  • 为什么不使用[**`enumerate`**](https://docs.python.org/2/library/functions.html#enumerate)为你计算? (2认同)

en_*_*ght 5

此处给出的两个答案的替代方法是使用为您进行格式化的内容,例如numpy。这通常是您可能不希望的外部依赖关系,但是如果您已经将内容存储在网格/矩阵中,则可以合理地选择:

from numpy import array
str(array(listA).reshape((3,3)))
Run Code Online (Sandbox Code Playgroud)

将其放入数组中,将其重塑为您喜欢的(兼容)形状,然后使其成为字符串。再直观不过了!