Pythonic способ напечатать таблицу - PullRequest
1 голос
/ 22 октября 2009

Я использую эту простую функцию:

def print_players(players):
    tot = 1
    for p in players:
        print '%2d: %15s \t (%d|%d) \t was: %s' % (tot, p['nick'], p['x'], p['y'], p['oldnick'])
        tot += 1

и я предполагаю, что ники не длиннее 15 символов.
Я хотел бы, чтобы каждый «столбец» был выровнен, есть ли какой-то синтаксический сахар, позволяющий мне делать то же самое, но держать столбец псевдонимов выровненным по левому краю, а не по правому краю, не разбивая столбец справа?

Эквивалентный, более уродливый код:

def print_players(players):
    tot = 1
    for p in players:
        print '%2d: %s \t (%d|%d) \t was: %s' % (tot, p['nick']+' '*(15-len(p['nick'])), p['x'], p['y'], p['oldnick'])
        tot += 1

Спасибо всем, вот финальная версия:

def print_players(players):
    for tot, p in enumerate(players, start=1):
        print '%2d:'%tot, '%(nick)-12s (%(x)d|%(y)d) \t was %(oldnick)s'%p

Ответы [ 4 ]

4 голосов
/ 22 октября 2009

Немного не по теме, но вы можете избежать явного добавления к tot, используя enumerate:

for tot, p in enumerate(players, start=1):
    print '...'
4 голосов
/ 22 октября 2009

Для выравнивания по левому краю вместо выравнивания по правому краю используйте %-15s вместо %15s.

3 голосов
/ 22 октября 2009

Или, если вы используете python 2.6, вы можете использовать формат метод строки:

Определяет словарь значений и использует их для dipslay:

>>> values = {'total':93, 'name':'john', 'x':33, 'y':993, 'oldname':'rodger'}
>>> '{total:2}: {name:15} \t ({x}|{y}\t was: {oldname}'.format(**values)
'93: john            \t (33|993\t was: rodger'
2 голосов
/ 22 октября 2009

Видя, что p кажется диктатом, как на счет:

print '%2d' % tot + ': %(nick)-15s \t (%(x)d|%(y)d) \t was: %(oldnick)15s' % p
...