таблица данных в Python - PullRequest
       5

таблица данных в Python

3 голосов
/ 21 августа 2011

У меня есть двумерный список в Python, например:

[['Something', 'Something else', 'Another thing'],
 ['Other things', 'More data', 'Element'],
 ['Stuff', 'data', 'etc']]

Я хочу, чтобы он был распечатан следующим образом:

    Something    Something else Another thing
    Other things More data      Element
    Stuff        data           etc

Ответы [ 6 ]

7 голосов
/ 21 августа 2011
l = [['Something', 'Something else', 'Another thing'],
     ['Other things', 'More data', 'Element'],
     ['Stuff', 'data', 'etc']]
sub1 = [
    [s.ljust(max(len(i) for i in column)) for s in column]
    for column in zip(*l)]
for p in [" ".join(row) for row in zip(*sub1)]: print p

Здесь сначала список преобразуется с помощью zip(*l): каждый из подсписков передается в качестве собственного аргумента zip().Результатом является список, который объединяет n-ые записи каждого старого списка, поэтому вы получаете [['Something', 'Other things', 'Stuff'], ['Something else', 'More data', 'data'], ...].

Тогда записи, длина которых должна совпадать, находятся в том же column.В каждом из этих column s строки ljust() редактируются до наибольшей длины в группе.

После этого новый список с настроенными длинами снова преобразуется - так же, как и выше -и компоненты, соединенные между собой " ".

Полученный 1D список затем печатается запись за записью.

2 голосов
/ 21 августа 2011

Вы можете использовать метод string format или даже более старый оператор интерполяции строк, чтобы размещать строки в полях фиксированной длины.См. формат строки документация.

Цикл, использующий это, не должен быть безобразным.

1 голос
/ 21 августа 2011
from itertools import chain

ll = [['Something', 'Something else', 'Another thing'],
 ['Other things', 'More data', 'Element'],
 ['Stuff', 'data', 'etc']]

# get the length of the longest item. 
# For simplicity, I use the same width for all columns
a = max(len(s) for s in chain.from_iterable(ll)) + 1 

# make a format string with the max
f = ('{:<' + str(a) + '}').format

# print the list
print '\n'.join(''.join(f(s) for s in sl) for sl in ll)
0 голосов
/ 28 августа 2011
li = [['Something', 'Something else', 'Another thing'],
      ['Other things', 'More data', 'Element'],
      ['Stuff', 'data', 'etc']]

print li,'\n'

print "tuple( max(map(len,x)) for x in zip(*li)) == ",\
      tuple( max(map(len,x)) for x in zip(*li))


print
patform = '%%-%ss %%-%ss %%-%ss' % tuple( max(map(len,x)) for x in zip(*li))
print '\n'.join(patform % tuple(x) for x in li)

# OR

print
patform = '{:<%s} {:<%s} {:<%s}' % tuple( max(map(len,x)) for x in zip(*li))
print '\n'.join(patform.format(*x) for x in li)

# OR

print
patform = '{{:<{}}} {{:<{}}} {{:<{}}}'.format( *tuple( max(map(len,x)) for x in zip(*li)) )
print '\n'.join(patform.format(*x) for x in li)

результат

[['Something', 'Something else', 'Another thing'], ['Other things', 'More data', 'Element'], ['Stuff', 'data', 'etc']] 

tuple( max(map(len,x)) for x in zip(*li)) ==  (12, 14, 13)

Something    Something else Another thing
Other things More data      Element      
Stuff        data           etc          

Something    Something else Another thing
Other things More data      Element      
Stuff        data           etc          

Something    Something else Another thing
Other things More data      Element      
Stuff        data           etc  
0 голосов
/ 21 августа 2011
print '\n'.join([line+' ' for line in l])
0 голосов
/ 21 августа 2011

Я не знаю, существует ли такая функция в библиотеке python (и я сомневаюсь, что вы ее найдете), но кажется, что простейшее решение - это двойной вложенный цикл.Просто конкатенируйте строки в конце внутреннего цикла с пустым пробелом (но я думаю, из того, как вы задали вопрос, вы хотите, чтобы они были выровнены, поэтому используйте экранирующий символ табуляции "\ t").Распечатайте их после выхода из внутреннего цикла, и это должно быть сделано.

РЕДАКТИРОВАТЬ: я вижу, я был прав насчет расстояния между вкладками ... escape-символ табуляции эквивалентен нажатию клавиши табуляции, если вам нужнобольше места, используйте несколько строк подряд "\ t \ t".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...