지정하십시오. 반복하려면 문자열으로 효율적인 방법으로 특정 길이? 예: '반복하십시오 (& # 39, abc& # 39, 7) - >. # 39, & # 39 abcabca&. '
다음은 현재 내 코드:
def repeat(string, length):
cur, old = 1, string
while len(string) < length:
string += old[cur-1]
cur = (cur+1)%len(old)
return string
(더 많은 파이썬) 이 더 나은 방법으로 있나요? 아마 목록을 사용하는 것이다.
First off, 여러 번 문자열으로 반복하려면 정수 곱셈 과부하된 사용할 수 있습니다.
>>> 'abc' * 7
'abcabcabcabcabcabcabc'
따라서 반복하려면 문자열으로 보살피되 it& # 39 의 at least deltamove 디스테이징하는 운영까지도 전날에약혼자에게 계산하십시오 오른쪽에 있는 것이 적절한 반복 횟수를 및 곱셈 연산자:
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'
# 39 의 pillmod& 오토메이티드 에 제안된 것으로, 또는 그 아래로 스크롤하면 아마 아무도 알 수 있을 만큼 훨씬 더 이상 사용할 수 있습니다 (['데이브 모드'] https://docs.python.org/3/library/functions.html # 데이브 모드) 수를 계산하는 데 필요한 추가 문자 수가 전체 반복, 한 번에요:
def pillmod_repeat_to_length(s, wanted):
a, b = divmod(wanted, len(s))
return s * a + s[:b]
어떤 것이 더? # 39 의 let& 벤치마트 있다.
>>> 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& # 39 의 버전은 40%, 이는 같은 일이 너무 느린 it& # 39 의 직접 읽을 수 있기 때문에 훨씬 더 나쁜 것 같아요. 그 이유는 여러 가지가 있습니다 이 시작하여, 약 40 퍼센트 더 컴파일하기를 바이트코드 지침.
참고: 이러한 예는 정수 연산 '/ /' 잘라내는 약간 새로운 사용할 수 있다. 이것은 종종 있지만, 3 은 파이썬 called 피쳐보다 따르면 [PEP 238] (https://www.python.org/dev/peps/pep-0238/), it all the way back in 파이썬 2.2 도입되었다. 안에서 사용할 수 있는 경우에만 have 파이썬 3 (또는 모듈에서는 future 가져오기의 사단 '의 있는') 이지만 can 상관 없이 바로 사용할 수 있습니다.
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]
그렇다면 '문자열 * (길이 / 렌 (string) + 문자열 [0 (길이 % 렌 (string)]'
아마도 가장 효율적인 솔루션, 하지만 확실히 파선-짧은 & 없습니다. 단순하다.
def repstr(string, length):
return (string * length)[0:length]
repstr("foobar", 14)
보기입니다 foobarfoobarfo" ";). 한 가지는 우리 섹스한거요 버전 에로남이네 경우 길이 <. 렌 출력 문자열 (string) 을 잘립니다. 예를 들면 다음과 같습니다.
repstr("foobar", 3)
보기입니다 foo" ";).
편집: 실제로 내 놀랍게도 이것은 현재 솔루션 (# 39, & # 39 는 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
아마도 문자열이 긴 경우, 또는 길이 굉장히 높았다. (즉, 이 경우 부품 구체화하십시오 * 길이 '낭비' 는 높은) 을 제대로 수행할 수 있을 것이라고 밝혔다. 우리는 이를 확인할 수 있으며, 사실 위의 수정할 수 있습니다.
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