Tengo un diccionario de Python con el lugar donde cada tecla corresponde a un título, y la lista asociada a cada encabezado contiene un número arbitrario de valores:el modo de hacer un diccionario Python como una tabla HTML con columnas verticales
data = {
"heading1": ['h1-val1', 'h1-val2', 'h1-val3', ],
"heading2": ['h2-val1', ],
"heading3": ['h3-val1', 'h3-val2', 'h3-val3', 'h3-val4', ],
}
necesito para hacer esto en una plantilla de Django como una mesa, donde los valores se enumeran verticalmente debajo de cada encabezamiento, con todos los valores que faltan prestados como vacía celda de la tabla:
<table>
<thead>
<tr>
<th>heading1</th>
<th>heading2</th>
<th>heading3</th>
</tr>
</thead>
<tbody>
<tr>
<td>h1-val1</td>
<td>h2-val1</td>
<td>h3-val1</td>
</tr>
<tr>
<td>h1-val2</td>
<td></td>
<td>h3-val2</td>
</tr>
<tr>
<td>h1-val3</td>
<td></td>
<td>h3-val3</td>
</tr>
<tr>
<td></td>
<td></td>
<td>h3-val4</td>
</tr>
</tbody>
</table>
Cuál es la mejor manera de lograr ¿esta?
Mi primera inclinación es reorganizar el dict original en una matriz 2D, y simplemente pasarlo a la plantilla. Sin embargo, estoy seguro de que no soy el primero en encontrarme con este tipo de problema, y tengo curiosidad de cómo otros han resuelto este problema.
ACTUALIZACIÓN: Solo como referencia, aquí está mi solución original a este problema (con lo que no estoy muy contento).
# Using the data dict from the question:
size = max(len(data['heading1']), len(data['heading2']), len(data['heading3']))
matrix = [[None, None, None] for i in range(size)] # initialize an empty matrix
# manually copy the data into the appropriate column :(
i = 0
for item in data['heading1']:
matrix[i][0] = item
i += 1
i = 0
for item in data['heading2']:
matrix[i][1] = item
i += 1
i = 0
for item in data['heading3']:
matrix[i][2] = item
i += 1
entonces pasa la matriz en la plantilla que parecía esto:
<table>
<thead><tr>
<th>heading1</th>
<th>heading2</th>
<th>heading3</th>
</tr></thead>
<tbody>
{% for row in matrix %}
<tr>
{% for col in row %}
<td>{% if col %}{{ col }}{% else %} {% endif %}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
Debería haber mencionado esto anteriormente, pero la razón por la que tendrá que dividir los títulos y los datos es como arunkumar se menciona: no se puede esperar que 'dict.items()' le entregue las claves en un orden predecible. Da la casualidad de que separar los encabezados de los datos _also_ simplifica la estructura de la plantilla. –
He actualizado el código para ocuparme de rellenar las listas. Debería eliminar la necesidad de inicializar la matriz vacía (por adelantado). –