¿Cómo representar visualmente datos en una tabla?

Una cosa es la tabla como estructura de datos, y otra es la tabla como representación visual de datos.

El problema de representar tablas visualmente está fuertemente atado al medio en el cuál se hará la representación.

Por ejemplo, si el medio es la consola de texto, el proceso clásico para «pintar» una tabla es por medio de un recorrido por todos los elementos de una colección, y al procesar cada elemento, hacer un recorrido por cada parte de ese elemento. Durante el procesamiento de una parte, se «imprime» por pantalla la representación del valor de esa parte. Al terminar de procesar todas las partes de un elemento, se «imprime» un salto de línea. Al empezar a procesar el siguiente elemento, todas las siguientes «impresiones» sucederan en la nueva línea que el previo salto produjo. Así sucede entonces que a cada elemento le corresponde una línea, dando el efecto visual de filas y columnas.

Entonces, lo primero que hay que definir es la colección de elementos.

Los elementos típicamente se almacenan en diccionarios o en objetos preparados específicamente para un problema determinado. En cualquier caso, cada parte del elemento es correspondido con una «clave» del diccionario o con un «atributo» del objeto.

Las colecciones pueden ser cualquier estructura de datos que sea «iterable», típicamente listas o conjuntos.

Ejemplo.

Si tenemos una colección de frutas, donde sabemos da cada fruta su nombre en español, en inglés y su caracter utf-8 y el punto de código en el Unicode:

colección_de_frutas = [
  {'nombre': 'tomate', 'name': 'tomato', 'carácter': '🍅', 'punto_código_unicode': 0x1F345},
  {'nombre': 'uva', 'name': 'grapes', 'carácter': '🍇', 'punto_código_unicode': 0x1F347},
  {'nombre': 'melón', 'name': 'melon', 'carácter': '🍈', 'punto_código_unicode': 0x1F348},
  {'nombre': 'patilla', 'name': 'watermelon', 'carácter': '🍉', 'punto_código_unicode': 0x1F349},
  {'nombre': 'mandarina', 'name': 'tangerine', 'carácter': '🍊', 'punto_código_unicode': 0x1F34A},
  {'nombre': 'lima', 'name': 'lemon', 'carácter': '🍋', 'punto_código_unicode': 0x1F34B},
  {'nombre': 'cambur', 'name': 'banana', 'carácter': '🍌', 'punto_código_unicode': 0x1F34C},
]
0.2s
Python

Podemos «pintar» una tabla con el siguiente proceso:

for fruta in colección_de_frutas:
  print(fruta['nombre'],                 '\t', end='')
  print(fruta['name'],                   '\t', end='')
  print(fruta['punto_código_unicode'],   '\t', end='')
  print(fruta['carácter'],               '\t', end='')
  print()
0.4s
Python

Como pueden ver, el resultado no es perfecto. El tomate, la uva, el melón, la lima y el cambur tienen la misma alineación, que es diferente a la que tienen la patilla y la mandarina.

Corregir estos detalles es un problema en si mismo que debe ser trabajado con independencia de la lógica que manipula la colección misma.

Es decir, los 2 bloques anteriores deben ser independientes.

Con respecto al código de representación de la tabla, podemos ver un patrón que se repite una y otra vez, que son los 4 `print`. Como sabemos de antemano los atributos de los elementos que queremos representar, y su orden correspondiente, podemos apoyarnos en una lista con esos atributos y con un recorrido realizar esos 4 `print`:

atributos = ['nombre', 'name', 'punto_código_unicode', 'carácter']
for fruta in colección_de_frutas:
  for atributo in atributos:
    print(fruta[atributo], '\t', end='')
  print()
0.4s
Python
Runtimes (1)