1

それがかなり簡単にできることは知ってい"%03d"ますが、少し異なる問題を解決しようとしています。私のスクリプトの一部では、範囲内 (0 ~ 999 など) に 3 (または問題の任意の数字) が少なくとも 1 つ含まれている数字がいくつあるかを調べる必要があります。だから、私はこのラムダ関数を思いついた:

fx = lambda z,y=999: [ "%03d" % (x, ) for x in range(y) if str(z) in str(x) ]

これはうまく機能していますが、範囲に応じてパディングの「先行ゼロ」ビットを自動化したいと考えています。たとえば、999 の場合は 003、88 の場合は 09 などです。どうすればそれを行うことができますか?

4

4 に答える 4

5

書式設定関数に動的な幅を渡したい場合は、次のことができます。

>>> width = 5
>>> value = 2
>>> '%0*d' % (width, value)
'00002'

プレースホルダー内にプレースホルダーを埋め込むことができるため、新しいスタイルの書式設定を使用するとさらに簡単になります。

>>> width = 5
>>> value = 2
>>> '{1:0{0}}'.format(width, value)
'00002'

出力する前にすべての値の中で最も長い値を取得する方法も知りたい場合は、値を 2 回反復できる限り、それは非常に簡単です。

>>> values = 3, 100, 50000
>>> width = max(len('%0d' % value) for value in values)
>>> ', '.join('%0*d' % (width, value) for value in values)
'00003, 00100, 50000'

また、パラメーターに基づいて作成する場合は、さらに簡単です。

fx = lambda z,y=999: [ "%0*d" % (len('%0d' % y), x) for x in range(y) if str(z) in str(x) ]

ただし、これは の幅をy何度も計算することになります。これは、式の内部に格納する簡単な方法がなく、 alambdaは式しか取得できないためです。

lambdaそもそもなぜ a を使用しているのかという疑問が生じます。lambdaoverの唯一の利点はdef、式で使用でき、名前を考える必要がないことです。名前に割り当てる場合は、両方の利点がなくなります。だから、これをしてください:

def fx(z, y=999):
    width = len('%0d' % y)
    return ["0%*d" % (width, x) for x in range(y) if str(z) in str(x)]
于 2013-05-09T22:40:37.810 に答える
0

フォーマットする代わりに `rjust' を使うのはどうですか?

fx = lambda z,y=999: [ str(x).rjust(len(str(y)), '0') for x in range(y) if str(z) in str(x) ]

そうすれば、 の幅に基づいてy、適切な数の「0」が得られます。

>>> fx(3, 10)
['03']
>>> fx(3, 100)
['003', '013', '023', '030', '031', '032', '033', '034', '035', '036', '037', '038', '039', '043', '053', '063', '073', '083', '093']
于 2013-05-09T22:38:18.223 に答える
0

これはどう:

'%0*d' % (len(str(top)), i)
于 2013-05-09T22:40:11.487 に答える