Jason Scheirerの答えは正しいですが、もう少し説明を使用することができます。
まず、文字列を整数回繰り返すには、オーバーロードされた乗算を使用できます。
>>> 'abc' * 7
'abcabcabcabcabcabcabc'
したがって、少なくとも必要な長さになるまで文字列を繰り返すには、適切な繰り返し回数を計算して、その乗算演算子の右側に配置します。
def repeat_to_at_least_length(s, wanted):
return s * (wanted//len(s) + 1)
>>> repeat_to_at_least_length('abc', 7)
'abcabcabc'
次に、配列スライスを使用して、必要な長さにトリミングできます。
def repeat_to_length(s, wanted):
return (s * (wanted//len(s) + 1))[:wanted]
>>> repeat_to_length('abc', 7)
'abcabca'
あるいは、pillmodの回答で示唆されているように、おそらく誰も気付かないほど下にスクロールしないので、divmod
必要な完全な繰り返しの数と余分な文字の数を一度に計算するために使用できます。
def pillmod_repeat_to_length(s, wanted):
a, b = divmod(wanted, len(s))
return s * a + s[:b]
どちらが良いですか?それをベンチマークしましょう:
>>> import timeit
>>> timeit.repeat('scheirer_repeat_to_length("abcdefg", 129)', globals=globals())
[0.3964178159367293, 0.32557755894958973, 0.32851039397064596]
>>> timeit.repeat('pillmod_repeat_to_length("abcdefg", 129)', globals=globals())
[0.5276265419088304, 0.46511475392617285, 0.46291469305288047]
つまり、pillmodのバージョンは40%遅いようなものですが、個人的にははるかに読みやすいと思うので、これは残念です。これにはいくつかの理由が考えられます。まず、約40%多くのバイトコード命令をコンパイルすることから始めます。
注:これらの例では、//
整数除算を切り捨てるためにnew-ish演算子を使用しています。これはPython3機能と呼ばれることがよくありますが、 PEP 238によると、 Python2.2でずっと前に導入されました。Python 3(またはを含むモジュール)でのみ使用する必要がありますが、関係なく使用できます。from __future__ import division