Visualizza un elenco di elementi verticalmente in una tabella anziché orizzontalmente
Domanda
Ho un elenco di elementi in ordine alfabetico:
mylist = [a,b,c,d,e,f,g,h,i,j]
Sono in grado di produrre l'elenco in una tabella HTML horizonally in questo modo:
| a , b , c , d |
| e , f , g , h |
| i , j , , |
Qual è l'algoritmo per creare la tabella in verticale in questo modo:
| a , d , g , j |
| b , e , h , |
| c , f , i , |
Sto usando python, ma la risposta può essere in qualsiasi lingua o addirittura pseudo-codice.
Soluzione
>>> l = [1,2,3,4,5,6,7,8,9,10]
>>> [l[i::3] for i in xrange(3)]
[[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]
Sostituire 3
per il numero di righe che si desidera in seguito:
>>> [l[i::5] for i in xrange(5)]
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
Altri suggerimenti
import itertools
def grouper(n, iterable, fillvalue=None):
# Source: http://docs.python.org/library/itertools.html#recipes
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
return itertools.izip_longest(*[iter(iterable)]*n,fillvalue=fillvalue)
def format_table(L):
result=[]
for row in L:
result.append('| '+', '.join(row)+' |')
return '\n'.join(result)
L = ['a','b','c','d','e','f','g','h','i','j']
L_in_rows=list(grouper(3,L,fillvalue=' '))
L_in_columns=zip(*L_in_rows)
print(format_table(L_in_columns))
# | a, d, g, j |
# | b, e, h, |
# | c, f, i, |
Ecco una soluzione approssimativa che funziona (i numeri stampe da 0 a N-1 compreso):
import math
NROWS = 3
N = 22
for nr in xrange(NROWS):
for nc in xrange(int(math.ceil(1.0 * N/NROWS))):
num = nc * NROWS + nr
if num < N:
print num,
print ''
Questo basta stampare i numeri, per esempio con NROWS = 3
e N = 22
:
0 3 6 9 12 15 18 21
1 4 7 10 13 16 19
2 5 8 11 14 17 20
Si può facilmente adattarsi per stampare tutto quello che vuoi, naturalmente, e aggiungere la formattazione desiderata.
int array_size = 26;
int col_size = 4;
for (int i = 0; i <= array_size/col_size; ++i) {
for (int j = i; j < array_size; j += col_size-1) {
print (a[j]);
}
print("\n");
}
Ecco come lo farei. Data la lista di l
(di numeri interi, nell'esempio).
- decidere il numero di colonne (o righe) e,
- Calcolare il numero di righe (o colonne) necessari.
- Poi ciclo tra loro, riga per riga e stampare il valore corrispondente.
Vedere codice qui sotto:
import math
l = [0,1,2,3,4,5,6,7,8,9]
num_cols=4
num_rows=int(math.ceil(1.0*len(l)/num_cols))
for r in range(num_rows):
for c in range(num_cols):
i = num_rows*c + r
if i<len(l):
print '%3d ' % l[i],
else:
print ' - ', # no value
print # linebreak
Best,
Philip
>>> import numpy as np
>>> L=['a','b','c','d','e','f','g','h','i','j']
>>> width=4
>>> height = (len(L)-1)/width+1
>>> L=L+[' ']*(width*height-len(L)) #Pad to be even multiple of width
>>> A = np.array([L])
>>> A.shape=(width,height)
>>> A.transpose()
array([['a', 'd', 'g', 'j'],
['b', 'e', 'h', ' '],
['c', 'f', 'i', ' ']],
dtype='|S1')