2009-08-05 21 views
0

故障コード:のpython文字列フォーマット操作

pos_1 = 234 
pos_n = 12890 
min_width = len(str(pos_n)) # is there a better way for this? 

# How can I use min_width as the minimal width of the two conversion specifiers? 
# I don't understand the Python documentation on this :(
raw_str = '... from %(pos1)0*d to %(posn)0*d ...' % {'pos1':pos_1, 'posn': pos_n} 

必要な出力:

... from 00234 to 12890 ... 

      ______________________EDIT______________________ 

新コード:

# I changed my code according the second answer 
pos_1 = 10234 # can be any value between 1 and pos_n 
pos_n = 12890 
min_width = len(str(pos_n)) 

raw_str = '... from % *d to % *d ...' % (min_width, pos_1, min_width, pos_n) 

新しい問題:

1つの余分な空白があります(私はそれをマークした_)整数値の前に、MIN_WIDTH桁intigers用:マッピングキーを追加する方法があるかどう

print raw_str 
... from _10234 to _12890 ... 

はまた、私は疑問に思いますか?はるかに使用可能なよりも私には思われる(代わりの13以上の

a = ["123", "12"]  
max_width = sorted([len(i) for i in a])[-1] 

プットMAX_WIDTHと、単一のアレイ内のすべての文字列を置く:

答えて

2
pos_1 = 234 
pos_n = 12890 
min_width = len(str(pos_n)) 

raw_str = '... from %0*d to %0*d ...' % (min_width, pos_1, min_width, pos_n) 
+0

imho、2番目の数字をパディングする必要はありません - それはすでに最小幅を持っています –

+0

真、2つの数字pos_1が負であり、したがって否定のために余分な文字が必要な場合には必要かもしれません)両方の幅を渡す方が安全です。 – Amber

+0

ありがとう、これまでのところ!塗りつぶし文字を* 0 *から*空白*に変更した後、ちょっとした問題にぶつかります。あなたが私の新しい例を見ることができれば嬉しいです。 – SimonSalman

1
"1234".rjust(13,"0") 

は何が必要

追加を行う必要があります変数のスタックを持つ)。

追加nastyness: (あなたの質問に近づくために数字の配列を使用する。)

a = [123, 33, 0 ,223] 
[str(x).rjust(sorted([len(str(i)) for i in a])[-1],"0") for x in a] 

Perlは簡単にBraindumpsをを生産する唯一の言語であることを特徴としますか? regexpsが複雑なコードのゴッドファーザーであるなら、リストの理解はゴッドマザーです。

(私はPythonには比較的新しいので、配列のどこかにmax-functionがなければならないと確信しています。これは複雑さを上回ります... ... OK、チェックあり、あります。 。)

[str(x).rjust(max([len(str(i) for i in a]),"0") for x in a] 

そして「外リスト内包内不変(最大値)の計算を入れていない」のコメントの下に遵守してください。右、:私はあなたがその'%(mykeyという)D' %{3 'にmykey'}のようなものを意味推測

: '%' への2番目の引数としてマッピングタイプを使用してに関する

+0

ありがとう、私は配列に関するあなたの提案を使用するつもりです。 * rjust *について:現在のところ、文字列フォーマットの*%*演算子を理解する必要があります。そのため、私はそれに縛られています。申し訳ありませんが、それを言及すべきでした。 – SimonSalman

+0

実際には、.rjust()リストを実行する前に、max()計算を中断して変数で取り込むことをお勧めします。それ以外の場合は、外側のリストの**アイテムごとに**内部のリストとmax()の値を再計算します! (しかし、リスト内包表記に関するあなたの一般的な発言は素敵です:) – ThomasH

1

?!私は "%* d"構文を使用する場合はこれを使用できないと思います。なぜなら、dictに必要な幅の引数を与える方法がないからです。

しかし、なぜ、あなたは動的にフォーマット文字列を生成しません。

fmt = '... from %%%dd to %%%dd ...' % (min_width, min_width) 
# assuming min_width is e.g. 7 fmt would be: '... from %7d to %7d ...' 
raw_string = fmt % pos_values_as_tuple_or_dict 

を使用すると、実際の値のフォーマットから幅の問題を切り離し、そしてあなたが後者のためのタプルや辞書を使用することができますこの方法それはあなたに合っています。

+0

私はそれを+1することはできません。それは面白いですが、 "% - オペレーターに固執する"ということを、少しでも読めないほどにすることではありませんか? おそらくお勧めではないにしても、何とかクールです。 –

+0

最終的な出力文字列は、常に小さく、扱いやすい部分で分割し、個別に扱うことができます( '%'または.rjustなど)。これらの部分文字列から最後の文字列を作成します。次に、* widthfmt = "%d"%min_widthのようなものです。 fieldfmt = "%" + widthfmt + "d" *はそれほど難しくありません。 – ThomasH