Soy bastante nuevo en Python y ahora estoy luchando por formatear bien mis datos para la salida impresa.
Tengo una lista que se usa para dos encabezados y una matriz que debería ser el contenido de la tabla. Al igual que:
teams_list = ["Man Utd", "Man City", "T Hotspur"]
data = np.array([[1, 2, 1],
[0, 1, 0],
[2, 4, 2]])
Tenga en cuenta que los nombres de encabezado no son necesariamente de la misma longitud. Sin embargo, las entradas de datos son todos enteros.
Ahora, quiero representar esto en un formato de tabla, algo como esto:
Man Utd Man City T Hotspur
Man Utd 1 0 0
Man City 1 1 0
T Hotspur 0 1 2
Tengo el presentimiento de que debe haber una estructura de datos para esto, pero no puedo encontrarla. He intentado usar un diccionario y formatear la impresión, he intentado bucles for con sangría y he intentado imprimir como cadenas.
Estoy seguro de que debe haber una manera muy simple de hacer esto, pero probablemente me la estoy perdiendo debido a la falta de experiencia.
Respuestas:
Algún código ad-hoc para Python 2.7:
Esto se basa en
str.format()
la especificación de formato Mini-idioma .fuente
Hay algunos paquetes de Python ligeros y útiles para este propósito:
1. tabular : https://pypi.python.org/pypi/tabulate
tabulate tiene muchas opciones para especificar encabezados y formato de tabla.
2. PrettyTable : https://pypi.python.org/pypi/PrettyTable
PrettyTable tiene opciones para leer datos de csv, html, base de datos sql. También puede seleccionar un subconjunto de datos, ordenar la tabla y cambiar los estilos de la tabla.
3. tabla de texto : https://pypi.python.org/pypi/texttable
con texttable puede controlar la alineación horizontal / vertical, el estilo de borde y los tipos de datos.
4. termtables : https://github.com/nschloe/termtables
con texttable puede controlar la alineación horizontal / vertical, el estilo de borde y los tipos de datos.
Otras opciones:
fuente
coalign
palabra clave de alineación de columnas no es compatible con la versión oficial de pypi. "tableprint": promedio, complejo de API, no hay suficientes ejemplos de uso común.fuente
pip install numpy
ahora usa ruedas binarias en la mayoría de las plataformas (sin compilación) . Obviamente, otras opciones de instalación binaria estaban disponibles incluso antes de eso.Python en realidad hace esto bastante fácil.
Algo como
tendrá la salida
El% dentro de la cadena es esencialmente un carácter de escape y los caracteres que lo siguen le dicen a Python qué tipo de formato deben tener los datos. El% afuera y después de la cadena le dice a Python que tiene la intención de usar la cadena anterior como la cadena de formato y que los siguientes datos deben ponerse en el formato especificado.
En este caso usé "% -12i" dos veces. Para desglosar cada parte:
De los documentos: https://docs.python.org/2/library/stdtypes.html#string-formatting
fuente
print('%-20.2f' % position['deg'], '%-17.2f' % position['v2'])
donde.2
especifica la precisión del flotadorf
Actualizando la respuesta de Sven Marnach para trabajar en Python 3.4:
fuente
Cuando hago esto, me gusta tener cierto control sobre los detalles de cómo se formatea la tabla. En particular, quiero que las celdas del encabezado tengan un formato diferente que las celdas del cuerpo, y los anchos de columna de la tabla solo sean tan anchos como cada uno debe ser. Aquí está mi solución:
Aquí está la salida:
fuente
Creo que esto es lo que estás buscando.
Es un módulo simple que solo calcula el ancho máximo requerido para las entradas de la tabla y luego solo usa rjust y ljust para hacer una impresión bonita de los datos.
Si desea que su rumbo izquierdo esté alineado a la derecha, simplemente cambie esta llamada:
Desde la línea 53 con:
fuente
Sé que llego tarde a la fiesta, pero acabo de hacer una biblioteca para esto que creo que realmente podría ayudar. Es extremadamente simple, por eso creo que deberías usarlo. Se llama TableIT .
Uso básico
Para usarlo, primero siga las instrucciones de descarga en la página de GitHub .
Luego impórtalo:
Luego haga una lista de listas donde cada lista interna sea una fila:
Entonces todo lo que tienes que hacer es imprimirlo:
Este es el resultado que obtienes:
Nombres de campo
Puede usar nombres de campo si lo desea ( si no está usando nombres de campo, no tiene que decir useFieldNames = False porque está configurado de forma predeterminada ):
De eso obtendrás:
Hay otros usos para, por ejemplo, podría hacer esto:
A partir de ese:
O podrías hacer:
Y de eso obtienes:
Colores
También puedes usar colores.
Puede usar colores mediante la opción de color ( de forma predeterminada está establecida en Ninguno ) y especificando valores RGB.
Usando el ejemplo de arriba:
Entonces obtendrás:
Tenga en cuenta que la impresión de colores puede no funcionar para usted, pero funciona exactamente igual que las otras bibliotecas que imprimen texto en color. Lo he probado y cada color funciona. El azul tampoco está desordenado como lo haría si usara el valor predeterminado
34m
secuencia de escape ANSI (si no sabe qué es eso, no importa). De todos modos, todo proviene del hecho de que cada color es un valor RGB en lugar de un valor predeterminado del sistema.Más información
Para obtener más información, consulte la página de GitHub
fuente
Python puro 3
Imprimirá
fuente
Una manera simple de hacer esto es recorrer todas las columnas, medir su ancho, crear una plantilla de fila para ese ancho máximo y luego imprimir las filas. No es exactamente lo que está buscando , porque en este caso, primero tiene que poner sus títulos dentro de la mesa, pero creo que podría ser útil para otra persona.
Lo usas así:
fuente
La siguiente función creará la tabla solicitada (con o sin numpy) con Python 3 (quizás también Python 2). Elegí establecer el ancho de cada columna para que coincida con el nombre del equipo más largo. Puede modificarlo si desea utilizar la longitud del nombre del equipo para cada columna, pero será más complicado.
Nota: Para un equivalente directo en Python 2 podría reemplazar el
zip
conizip
de itertools.Esto producirá la siguiente tabla:
Si desea tener separadores de línea vertical, puede reemplazar
" ".join
con" | ".join
.Referencias
fuente
Intentaría recorrer la lista y usar un formateador CSV para representar los datos que desea.
Puede especificar pestañas, comas o cualquier otro carácter como delimitador.
De lo contrario, simplemente recorra la lista e imprima "\ t" después de cada elemento
http://docs.python.org/library/csv.html
fuente
Encontré esto solo buscando una forma de generar columnas simples. Si solo necesita columnas sin complicaciones , puede usar esto:
EDITAR: estaba tratando de ser lo más simple posible, y así hice algunas cosas manualmente en lugar de usar la lista de equipos. Para generalizar a la pregunta real del OP:
Ouputs:
Pero esto ya no parece más simple que las otras respuestas, con tal vez el beneficio de que no requiere más importaciones. Pero la respuesta de @ campkeith ya cumplió con eso y es más robusta ya que puede manejar una variedad más amplia de longitudes de etiquetas.
fuente