Использование Python's Format Specification Mini-Language для указания или автоматического определения ширины столбца - PullRequest
0 голосов
/ 04 марта 2012

У меня есть следующий пример в Python для печати таблицы:

job_IDs = ['13453', '123', '563456'];
memory_used = [30, 150.54, 20.6];
memory_units = ['MB', 'GB', 'MB'];

for i in range(len(job_IDs)):
    print "Job {item:15} {value[0]:>6}.{value[1]:<6} {units:3}".format(
    item=job_IDs[i]+':', value=memory_used[i].split('.') if '.' in memory_used[i] 
    else  (memory_used[i], '0'), units=memory_units[i])

, что приводит к:

Job 13453:                 30          MB
Job 123:                  150.54       MB
Job 563456:                20.6        GB

Вертикальное выравнивание является правильным для чегоМне нужно, но горизонтальный отступ вручную жестко закодирован в коде, где он говорит:

"Job {item:15} {value[0]:>6}.{value[1]:<6} {units:3}"

(«параметры заполнения» выше 15, 6, 6, 3)

Я хотел быto:

  • В идеале, значения заполнения должны определяться автоматически (т.е. вычисляться по максимальной ширине каждого поля) вместо необходимости жестко их кодировать в приведенной выше инструкции.

    В приведенном выше примере было бы здорово иметь фрагмент, который использует ширину самых широких записей в job_IDs, memory_used и memory_units и выводит, оставляя один пробел между столбцами:

    Job 13453:   30    MB
    Job 123:    150.54 MB
    Job 563456:  20.6  GB
    
  • В качестве альтернативы я бы также заинтересовался решением, позволяющим мне указывать такие отступы в переменных (в случае, если я хочу контролировать ширину, заданную каждомустолбец).

Меня интересуют решения обеих задач: с заполнением, вычисляемым автоматически, и с заполнением, указанным с помощью переменных.

Кстати, этот вопросбыл вдохновлен другим вопросом: Использование мини-языка спецификации формата Python для выравнивания чисел

1 Ответ

1 голос
/ 04 марта 2012

Вы можете вложить аргументы для изменения ширины целого числа следующим образом:

job_IDs = ['13453', '123', '563456'];
memory_used = ['30', '150.54', '20.6'];
memory_units = ['MB', 'GB', 'MB'];

w1=15
w2=6
w3=6
w4=3
for i in range(len(job_IDs)):
    v=memory_used[i].split('.') if '.' in memory_used[i] else  (memory_used[i], '0')

    print "Job {item:{w1}} {value[0]:>{w2}}.{value[1]:<{w3}} {units:{w4}}".format(
       item=job_IDs[i]+':', w1=w1, w2=w2,w3=w3,w4=w4, value=v, units=memory_units[i])

Таким образом, чтобы определить ширину поля для использования, просто зациклите один раз перед печатью, чтобы определить самую широкую ширину, используемую для каждой применимой встроенной переменной ширины.

Вот так:

job_IDs = ['13453', '123', '563456'];
memory_used = ['30', '150.54', '20.6'];
memory_units = ['MB', 'GB', 'MB'];

w1=1
w2=1
w3=1
w4=1
for i in range(len(job_IDs)):
    v=memory_used[i].split('.') if '.' in memory_used[i] else  (memory_used[i], '0')
    item=job_IDs[i]+':'
    units=memory_units[i]
    if len(item)>w1: w1=len(item)
    if len(v[0])>w2: w2=len(v[0])
    if len(v[1])>w3: w3=len(v[1])
    if len(units)>w4: w3=len(units)

for i in range(len(job_IDs)):
    v=memory_used[i].split('.') if '.' in memory_used[i] else  (memory_used[i], '0')
    item=job_IDs[i]+':'
    units=memory_units[i]    
    print "Job {item:{w1}} {value[0]:>{w2}}.{value[1]:<{w3}} {units:{w4}}".format(
      item=item,w1=w1, w2=w2,w3=w3,w4=w4, value=v, units=units)

Выход:

Job 13453:   30.0  MB
Job 123:    150.54 GB
Job 563456:  20.6  MB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...