web-dev-qa-db-fra.com

Jolie liste 2D en Python

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

Donc ça:

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

deviendrait quelque chose comme

A    B
C    D

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

42
houbysoft

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 appliquez ensuite le code ci-dessus.

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

53
georg

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
23
sten

Vous pouvez toujours utiliser numpy

import numpy as np
print(np.matrix(A))
14
Souradeep Nanda

Pour Python 3:

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
6
Rodrigo López

Vous pouvez mettre à jour le end=' ' de print afin qu'il imprime un espace au lieu de '\ n' dans la boucle interne et que la boucle externe puisse avoir print().

a=[["a","b"],["c","d"]] for i in a: for j in i: print(j, end=' ') print()

J'ai trouvé cette solution de ici https://snakify.org/en/lessons/two_dimensional_lists_arrays/ .

0
Sandeep

Une approche plus légère que pandas consiste à utiliser le module prettytable

from prettytable import PrettyTable

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

p = PrettyTable()
for row in x:
    p.add_row(row)

print p.get_string(header=False, border=False)

rendements:

A B
C D

prettytable a beaucoup d'options pour formater votre sortie de différentes manières.

Voir https://code.google.com/p/prettytable/ pour plus d'informations.

0
Dov Grobgeld