2011-12-08 10 views
1

私はPythonに少し新しく、VB.NET、C、および他のいくつかの奇妙な言語を手に入れました。この場合、一連の整数値を列に出力し、できるだけ少量のコードに集中したいと考えています。普通文字列でフォーマットされた整数の行をPythonで中心にしますか?

、これは、容易である。

zを介し w、文字列、 s4スルー s1は、中心であることがフィールドの幅を指定するいくつかの整数値である

print "%s|%s|%s|%s" \ 
     % (s1.center(w), s2.center(x), s3.center(y), s4.center(z)) 


整数にcenter関数がないため、%0.2xまたは%4dのような書式指定子を使用したい場合は、数値をそのまま使用しても機能しません。

よりC指向のアプローチを使用して、私は、それぞれ独立して整数に変換することができます:

s1 = str("%0.4x" % (i)).center(w) 
s2 = str("%0.2x" % (i)).center(x) 
s3 = str("%0.2x" % (i)).center(y) 
s4 = str("%0.8x" % (i)).center(z) 
print "%s|%s|%s|%s" % (s1, s2, s3, s4) 


をしかし、それは私が正しく専門用語を拾っていた場合、「unpythonic」のようです。これを行うための良い "ピジョン"の方法は何でしょうか? Python 2.4と2.7で動作するものでなければなりません(私は両方の環境で作業しています)。

ありがとうございます! widths

答えて

1
ints = [1, 2, 3, 4] 
widths = [(4, w), (2, x), (2, y), (8, z)] 
for i in ints: 
    print "%s|%s|%s|%s" % tuple(((("%0." + str(padding) + "d") % (i)).center(width)) for padding, width in widths) 

各タプルは、幅に関連した各パディングが"%0.[padding]d"の書式文字列で使用される(パディング、幅)、です。

+0

このアドレ私の必要性をエッセンスしますが、私はループのために二重を最適化する方法を見つけることを試みます。 Pythonには、他の言語では利用できないことを行うための好奇心をそそるものがあるようです。 – Kumba

1

あなたはそれぞれの値が同じようにフォーマットされているという事実を強調することができます

def as_output_field(value, width): 
    return ('%0.4d' % value).center(width) 

をし、データ駆動型の方法で、幅と値処理できます

values = [s1,s2,s3,s4] 
widths = [w,x,y,z] 

そして、あなたをあなたのフォーマットは、共通の文字で区切られた一連の類似したフィールドで構成されているということを強調することができます:

print '|'.join(as_output_field(value, width) for value, width in zip(values, widths)) 
+0

これは興味深い答えです。私の出力は16進数で、異なるパディング量であるため、私の具体的な例は完全には答えていません。私はおそらく、行進から述べたはずのはずです。しかし、それは私が同じスクリプトで持っている別の機能に解決策を提供します。あなたは少なくともそれのアップコートを手に入れます。しかし、私はU-DONの例をより完全な解決策にする必要があります。しかし、私はおそらく両方でやりとりしたり、おそらくそれらを統合したり、2つのハイブリッドを進化させたりします。残念私は私の答えを半分と半分に分けることができません。 – Kumba

+0

「異なるパディング量」は、同じ方法で別のリストで処理できます。または、意図した書式と一緒に番号をバインドするクラスを作成することもできます。据え置きは、プロセスに挿入するのも簡単です。 –

関連する問題