回答:
def repeat_to_length(string_to_expand, length):
return (string_to_expand * ((length/len(string_to_expand))+1))[:length]
python3の場合:
def repeat_to_length(string_to_expand, length):
return (string_to_expand * (int(length/len(string_to_expand))+1))[:length]
int()
ここでは同じことを行いますが、//
2つのコマンドではなく1つのコマンドで分割とフロアを行うため、顕微鏡的には高速になる可能性があります。
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 演算子を使用しています。これはしばしばPython 3機能と呼ばれますが、PEP 238によると、それはPython 2.2でずっと導入されました。あなただけ持っているのPython 3(または持っているモジュール内でそれを使用することfrom __future__ import division
)ができますが、できる関わらず、それを使用しています。
おそらく最も効率的なソリューションではありませんが、確かに短く単純です:
def repstr(string, length):
return (string * length)[0:length]
repstr("foobar", 14)
「foobarfoobarfo」を与えます。このバージョンの1つは、長さが<len(string)の場合、出力文字列が切り捨てられることです。例えば:
repstr("foobar", 3)
「foo」を与えます。
編集:実際には驚いたことに、これは現在受け入れられているソリューション( 'repeat_to_length'関数)よりも高速で、少なくとも短い文字列では:
from timeit import Timer
t1 = Timer("repstr('foofoo', 30)", 'from __main__ import repstr')
t2 = Timer("repeat_to_length('foofoo', 30)", 'from __main__ import repeat_to_length')
t1.timeit() # gives ~0.35 secs
t2.timeit() # gives ~0.43 secs
おそらく、ストリングが長い場合、または長さが非常に高い場合(つまり、string * length
パーツの無駄が多い場合)は、パフォーマンスが低下します。そして実際に、これを検証するために上記を変更できます:
from timeit import Timer
t1 = Timer("repstr('foofoo' * 10, 3000)", 'from __main__ import repstr')
t2 = Timer("repeat_to_length('foofoo' * 10, 3000)", 'from __main__ import repeat_to_length')
t1.timeit() # gives ~18.85 secs
t2.timeit() # gives ~1.13 secs
いかがですか string * (length / len(string)) + string[0:(length % len(string))]
length / len(string)
括弧で囲む必要があり、最後のがありません]
。
//
Python 3で整数除算を使用する必要があると思います0
。スプライスのinはオプションです。(もちろん、コロンは必須です。)
この質問に対する十分な回答が得られたわけではありませんが、繰り返し機能があります。リストを作成し、出力に参加するだけです:
from itertools import repeat
def rep(s,n):
''.join(list(repeat(s,n))
"abc", 4
期待するでしょう"abca"
。これは作成されますabcabcabcabc
def extended_string (word, length) :
extra_long_word = word * (length//len(word) + 1)
required_string = extra_long_word[:length]
return required_string
print(extended_string("abc", 7))
//
Python 3にある必要はありませんか?または、を削除+1
し、上限関数への明示的な呼び出しを使用するだけで十分です。また、注意:生成された文字列は、均等に分割されると実際には余分な繰り返しがあります。余分はスプライスによって切断されます。最初は混乱しました。