Отображение списка элементов по вертикали в таблице, а не по горизонтали - PullRequest
4 голосов
/ 22 марта 2010

У меня есть список элементов, отсортированных по алфавиту:

mylist = [a,b,c,d,e,f,g,h,i,j]

Я могу вывести список в HTML-таблицу по горизонтали, например:

| a , b , c , d |
| e , f , g , h |
| i , j ,   ,   |

Какой алгоритм для создания таблицы по вертикали такой:

| a , d , g , j |
| b , e , h ,   |
| c , f , i ,   |

Я использую python, но ваш ответ может быть на любом языке или даже псевдокоде.

Ответы [ 6 ]

9 голосов
/ 22 марта 2010
>>> 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]]

Замените 3 на количество строк, которое вы хотите получить:

>>> [l[i::5] for i in xrange(5)]
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
1 голос
/ 22 марта 2010
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,   |
0 голосов
/ 23 марта 2010
>>> 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')
0 голосов
/ 22 марта 2010

Вот как я это сделаю. Дан список l (в примере целых чисел).

  • Определите количество столбцов (или строк) и
  • Рассчитать количество необходимых строк (или столбцов).
  • Затем переберите их, строка за строкой и выведите соответствующее значение.

См. Код ниже:

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

Лучшее

Philip

0 голосов
/ 22 марта 2010
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");
}
0 голосов
/ 22 марта 2010

Вот примерное решение, которое работает (печатает числа от 0 до N-1 включительно):

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 ''

Это просто печатает числа, например, с NROWS = 3 и N = 22:

0 3 6 9 12 15 18 21 
1 4 7 10 13 16 19 
2 5 8 11 14 17 20 

Вы можете легко адаптировать его для печати чего угодно и добавить необходимое форматирование.

...