Estoy tratando de crear una buena lista de columnas en Python para usar con las herramientas de administración de línea de comandos que creo.
Básicamente, quiero una lista como:
[['a', 'b', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]
Convertirse en:
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
El uso de pestañas simples no funcionará aquí porque no conozco los datos más largos en cada fila.
Este es el mismo comportamiento que 'column -t' en Linux.
$ echo -e "a b c\naaaaaaaaaa b c\na bbbbbbbbbb c"
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
$ echo -e "a b c\naaaaaaaaaa b c\na bbbbbbbbbb c" | column -t
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
He buscado varias bibliotecas de Python para hacer esto, pero no puedo encontrar nada útil.
Respuestas:
Lo que hace esto es calcular la entrada de datos más larga para determinar el ancho de la columna, luego usar
.ljust()
para agregar el relleno necesario al imprimir cada columna.fuente
longest
es engañoso porque no es el elemento más largo sino el max_length. Por cierto, la más larga podrían adoptarse con algo como:max((w for sub in data for w in sub), key=len)
. [PD: yo no fui el que votó en contra]max((w for ...), key=len)
te da la entrada más larga y luego tendrás que volver a correrlen
. No pude decidir cuál estaba claro, así que me quedé con el primero. Buen punto sobre el nombre de var engañoso. Cambiado.max(len(x) for sub in data for x in sub)
que tampoco crea listas innecesarias.column -t
hace.Desde Python 2.6+, puede usar una cadena de formato de la siguiente manera para establecer las columnas en un mínimo de 20 caracteres y alinear el texto a la derecha.
Salida:
fuente
{: >20}
para mostrar más camposVine aquí con los mismos requisitos, pero las respuestas de @lvc y @ Preet parecen más en línea con lo que
column -t
produce en el sentido de que las columnas tienen diferentes anchos:fuente
map(len, map(str, col))
.Esto es un poco tarde para la fiesta y un complemento descarado para un paquete que escribí, pero también puede consultar el paquete Columnar .
Toma una lista de listas de entrada y una lista de encabezados y genera una cadena con formato de tabla. Este fragmento crea una tabla similar a la ventana acoplable:
O puedes ponerte un poco más elegante con colores y bordes.
Para leer más sobre el algoritmo de tamaño de columna y ver el resto de la API, puede consultar el enlace anterior o ver el repositorio de GitHub en columnas.
fuente
Tienes que hacer esto con 2 pases:
str.ljust()
ystr.rjust()
fuente
Transponer las columnas así es un trabajo para zip:
Para encontrar la longitud requerida de cada columna, puede usar
max
:Que puede usar, con el relleno adecuado, para construir cadenas para pasar a
print
:fuente
Para conseguir mesas más elegantes como
puedes usar esta receta de Python :
La página de recetas de Python contiene algunas mejoras.
fuente
pandas
solución basada en la creación de marco de datos:Para eliminar los valores de índice y encabezado para crear la salida que desee, puede usar el
to_string
método:fuente
Scolp es una nueva biblioteca que le permite imprimir fácilmente datos en columnas de transmisión en tiempo real mientras ajusta automáticamente el ancho de la columna.
(Descargo de responsabilidad: soy el autor)
fuente
Esto establece anchos de columna independientes que se ajustan mejor en función de la métrica máxima utilizada en otras respuestas.
fuente
Para gente perezosa
que utilizan Python 3. * y Pandas / Geopandas ; sencillo y universal en su clase de enfoque (para la escritura 'normal' simplemente quitar auto ):
Función colorear:
Encabezamiento:
y luego datos del marco de datos de Pandas / Geopandas:
Significado de
{0:<30} {1:>35} {2:>35} {3:>35} {4:>20} {5:>20}
:0, 1, 2, 3, 4, 5
-> columnas, hay 6 en total en este caso30, 35, 20
-> ancho de columna (tenga en cuenta que tendrá que agregar la longitud de\033[96m
; esto para Python también es una cadena), solo experimente :)>, <
-> justificar: derecha, izquierda (también hay=
para rellenar con ceros)Resultado:
fuente
Una ligera variación en una respuesta anterior (no tengo suficiente representante para comentarla). La biblioteca de formatos le permite especificar el ancho y la alineación de un elemento pero no dónde comienza, es decir, puede decir "tener 20 columnas de ancho" pero no "comenzar en la columna 20". Lo que conduce a este problema:
Salida
La respuesta, por supuesto, es también formatear las cadenas literales, lo que se combina de forma un poco extraña con el formato:
Salida
fuente
Encontré esta respuesta súper útil y elegante, originalmente de aquí :
Salida
fuente
Aquí hay una variación de la respuesta de Shawn Chin. El ancho se fija por columna, no en todas las columnas. También hay un borde debajo de la primera fila y entre las columnas. ( La biblioteca icontract se usa para hacer cumplir los contratos).
Aquí hay un ejemplo:
fuente
Se actualizó la receta elegante de @Franck Dernoncourt para que sea compatible con Python 3 y PEP8
fuente
Me doy cuenta de que esta pregunta es antigua, pero no entendí la respuesta de Antak y no quería usar una biblioteca, así que lancé mi propia solución.
La solución asume que los registros son una matriz 2D, los registros tienen la misma longitud y que los campos son todos cadenas.
fuente