J'ai besoin d'imprimer un tableau 3 x 3 pour un jeu appelé TicTackToe.py. Je sais que nous pouvons imprimer des éléments d'une liste de manière horizontale ou verticale en utilisant

listA=['a','b','c','d','e','f','g','h','i','j']
# VERTICAL PRINTING 
for item in listA:
        print item

Production:

a
b
c

Ou

# HORIZONTAL  PRINTING
for item in listA:
        print item,

Production:

a b c d e f g h i j

Comment puis-je imprimer un mélange des deux, par exemple l'impression d'une boîte 3x3 comme

a b c
d e f
g h i
15
Smple_V 10 mars 2016 à 01:19

7 réponses

Meilleure réponse

Vous pouvez enumerate le et imprimer une nouvelle ligne uniquement tous les trois éléments:

for index, item in enumerate('abcdefghij', start=1):
    print item,
    if not index % 3:
        print

Production:

a b c
d e f
g h i
j

enumerate commence à compter à partir de zéro par défaut, j'ai donc défini start=1.

Comme le commente @arekolek, si vous utilisez Python 3, ou si vous avez importé la fonction d'impression du futur pour Python 2, vous pouvez spécifier la ligne se terminant en une seule fois, au lieu des deux étapes ci-dessus:

for index, item in enumerate('abcdefghij', start=1):
    print(item, end=' ' if index % 3 else '\n')
23
Peter Wood 10 mars 2016 à 11:41

Une méthode qui n'a pas été mentionnée: Obtenez la tranche de la liste mathématiquement et print par la tranche de la liste.

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

Dans 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=" ")
1
Ian 10 mars 2016 à 10:58
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 est génial.

0
Miles Gillham 15 mars 2016 à 02:13

Une approche simple serait d'utiliser l'opérateur modulo:

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

Comme l'a souligné Peter Wood, vous pouvez utiliser l'opérateur énumérateur, pour éviter la variable 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],
8
Maecky 9 mars 2016 à 22:36

Vous pouvez utiliser la méthode de formatage de l'objet chaîne:

for i in range(3):
    print "{} {} {}".format(*listA[3*i:3*i+3])

De plus, au lieu de multiplier l'index par 3 à chaque itération, vous pouvez simplement suivre les étapes de trois éléments dans la liste:

for i in range(0, len(listA), 3):
    print "{} {} {}".format(*listA[i:i+3])
4
Mad Physicist 10 mars 2016 à 04:47

Une alternative aux deux réponses données ici est d'utiliser quelque chose qui fait le formatage pour vous, comme numpy. C'est une dépendance externe que vous ne voudrez peut-être pas en général, mais si vous stockez déjà des choses dans des grilles / matrices, cela peut être un choix logique:

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

Mettez-le dans un tableau, remodelez-le dans votre forme préférée (compatible) et faites-en une chaîne. Rien de plus intuitif!

5
en_Knight 9 mars 2016 à 22:37

Vous pouvez utiliser la logique de la recette de groupeur:

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

Si vous ne voulez pas perdre d'éléments, utilisez izip_longest avec une chaîne vide comme valeur de remplissage:

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=""))))

Ce qui diffère en ce qu'il garde le j:

a b c
d e f
g h i
j  

Vous pouvez mettre la logique dans une fonction et l'appeler quand vous voulez imprimer, en passant toutes les valeurs que vous voulez.

from itertools import izip_longest

def print_matrix(m,n, fill):
    print( "\n".join(map(" ".join, izip_longest(*[iter(m)] * n, fillvalue=fill))))

Ou sans outils itert juste fragmenter et rejoindre, vous pouvez également prendre un argument sep à utiliser comme délimiteur:

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

Il vous suffit de passer la liste et la taille de chaque ligne:

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
11
Padraic Cunningham 9 mars 2016 à 22:39