88 votes

Une jolie liste 2D imprimée ?

Existe-t-il un moyen simple et intégré d'imprimer une liste Python en 2D sous forme de matrice 2D ?

Alors ça :

[["A", "B"], ["C", "D"]]

deviendrait quelque chose comme

A    B
C    D

J'ai trouvé le pprint mais il ne semble pas faire ce que je veux.

91voto

georg Points 52691

Pour rendre les choses intéressantes, essayons avec une matrice plus grande :

matrix = [
   ["Ah!",  "We do have some Camembert", "sir"],
   ["It's a bit", "runny", "sir"],
   ["Well,",  "as a matter of fact it's", "very runny, sir"],
   ["I think it's runnier",  "than you",  "like it, sir"]
]

s = [[str(e) for e in row] for row in matrix]
lens = [max(map(len, col)) for col in zip(*s)]
fmt = '\t'.join('{{:{}}}'.format(x) for x in lens)
table = [fmt.format(*row) for row in s]
print '\n'.join(table)

Sortie :

Ah!                     We do have some Camembert   sir            
It's a bit              runny                       sir            
Well,                   as a matter of fact it's    very runny, sir
I think it's runnier    than you                    like it, sir  

UPD : pour les cellules multilignes, quelque chose comme ceci devrait fonctionner :

text = [
    ["Ah!",  "We do have\nsome Camembert", "sir"],
    ["It's a bit", "runny", "sir"],
    ["Well,",  "as a matter\nof fact it's", "very runny,\nsir"],
    ["I think it's\nrunnier",  "than you",  "like it,\nsir"]
]

from itertools import chain, izip_longest

matrix = chain.from_iterable(
    izip_longest(
        *(x.splitlines() for x in y), 
        fillvalue='') 
    for y in text)

Et ensuite appliquer le code ci-dessus.

Voir aussi http://pypi.python.org/pypi/texttable

53voto

user1019129 Points 261

Si vous pouvez utiliser Pandas (Python Data Analysis Library), vous pouvez imprimer une matrice 2D en la convertissant en un objet DataFrame :

from pandas import *
x = [["A", "B"], ["C", "D"]]
print DataFrame(x)

   0  1
0  A  B
1  C  D

47voto

Rodrigo López Points 2863

Pour Python 3 sans librairies tierces :

matrix = [["A", "B"], ["C", "D"]]

print('\n'.join(['\t'.join([str(cell) for cell in row]) for row in matrix]))

Sortie

A   B
C   D

37voto

Souradeep Nanda Points 856

Vous pouvez toujours utiliser numpy :

import numpy as np
A = [['A', 'B'], ['C', 'D']]
print(np.matrix(A))

Sortie :

[['A' 'B']
 ['C' 'D']]

9voto

Anonymous Points 382

Juste pour fournir une alternative plus simple à print('\n'.join(\['\t'.join(\[str(cell) for cell in row\]) for row in matrix\])) :

matrix = [["A", "B"], ["C", "D"]]
for row in matrix:
    print(*row)

Explication *row déballer row Así que print("A", "B") est appelé lorsque row es ["A", "B"] par exemple.

Note Les deux réponses ne seront bien formatées que si chaque colonne a la même largeur. Pour modifier le délimiteur, utilisez la fonction sep mot-clé. Par exemple,

for row in matrix:
    print(*row, sep=', ')

imprimera

A, B
C, D

à la place.

Une seule ligne sans boucle pour

print(*(' '.join(row) for row in matrix), sep='\n')

' '.join(row) for row in matrix) renvoie une chaîne pour chaque ligne, par exemple A B cuando row es ["A", "B"] .

*(' '.join(row) for row in matrix), sep='\n') déballe le générateur en retournant la séquence 'A B', 'C D' de sorte que print('A B', 'C D', sep='\n') est appelé pour l'exemple matrix donné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X