17

Python のFormat Specification Mini-Languageを使用して、文字列の表示方法をより詳細に制御できることを読みました。しかし、それを使用して浮動小数点数を小数点に揃えて表示する方法を理解するのに苦労しています。

たとえば、次の 3 つのリストがあるとします。

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

これらの 3 つのリストを反復処理して出力したいと思います

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

これまでのところ、私は試しました:

for i in range(len(jobIDs)):
   my_str = "{item:15}{value:6} {units:3}".format( 
   item='Job ' + job_IDs[i] + ':' , value=str(memories[i]),units=memory_units[i]);

   print my_str

これは次を印刷します:

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

これはほぼ正しいですが、浮動小数点数が小数点の周りに配置されていません。Python のFormat Specification Mini-Languageを必要な方法で使用するにはどうすればよいですか?

4

4 に答える 4

13

これはあなたが望むものです:

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])

仕組みは次のとおりです。

これは主要部分です: value=memory_used[i].split('.') if '.' in memory_used[i] else (memory_used[i], '0')、つまり、小数点がある場合は、文字列を全体と小数部分として分割するか、小数部分を 0 に設定します。

次に、フォーマット文字列:{value[0]:>6}.{value[1]:<6}は、全体の部分が右にシフトされ、その後にドットが続き、次に小数部分が左にシフトされることを意味します。

これは次を印刷します:

Job 13453:              30.0      MB
Job 123:               150.54     GB
Job 563456:             20.6      MB
于 2012-03-03T19:37:10.457 に答える
12

.split('.')アイデアに基づいた別の実装を次に示します。より読みやすいかもしれません。で分割し'.'、左部分を右揃え、右部分を左揃えにします。

width = max(map(len, job_IDs)) # width of "job id" field 
for jid, mem, unit in zip(job_IDs, memory_used, memory_units):
  print("Job {jid:{width}}: {part[0]:>3}{part[1]:1}{part[2]:<3} {unit:3}".format(
    jid=jid, width=width, part=str(mem).partition('.'), unit=unit))

出力

Job 13453 :  30     MB 
Job 123   : 150.54  GB 
Job 563456:  20.6   MB 
于 2012-03-03T19:50:36.917 に答える
4

それが役立つ場合は、私が使用する同様の関数を次に示します。

def align_decimal(number, left_pad=7, precision=2):
    """Format a number in a way that will align decimal points."""
    outer = '{0:>%i}.{1:<%i}' % (left_pad, precision)
    inner = '{:.%if}' % (precision,)
    return outer.format(*(inner.format(number).split('.')))

小数点以下の固定精度を許可します。

于 2012-06-14T14:23:55.310 に答える
1

これはそれを行います:

import re

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

for i in range(len(job_IDs)):
    lh=re.match(r'(\d+)',memory_used[i]).group(1)
    if '.' in memory_used[i]:
        rh=re.match(r'(\d+)\.(\d+)',memory_used[i]).group(2)
        sep='.'
    else:
        rh=''    
        sep=' '


    my_str = "{item:15}{l:>6}{s:1}{r:6} {units:3}".format( 
    item='Job ' + job_IDs[i] + ':' , l=lh,s=sep,r=rh,units=memory_units[i])

    print my_str

正確な出力を得るには、オプションの「.」で文字列を分割する必要があります。

これらの文字列をフロートに変換することもできます。

于 2012-03-03T19:51:33.820 に答える