Qual é uma maneira eficiente de repetir uma string com um determinado comprimento? Por exemplo:repeat('abc', 7) -> 'abcabca'
Aqui está meu código atual:
def repeat(string, length):
cur, old = 1, string
while len(string) < length:
string += old[cur-1]
cur = (cur+1)%len(old)
return string
Existe uma maneira melhor (mais pitônica) de fazer isso? Talvez usando compreensão de lista?
//
no Python 3? Ou largar+1
e usar uma chamada explícita para uma função de teto seria suficiente. Além disso, uma observação: a sequência gerada realmente tem uma repetição extra quando se divide uniformemente; o extra é cortado pela emenda. Isso me confundiu no começo.int()
faz a mesma coisa aqui, mas sim,//
pode ser microscopicamente mais rápido, porque faz a divisão e o piso em um comando em vez de dois.A resposta de Jason Scheirer está correta, mas poderia ser mais útil.
Primeiro, para repetir uma sequência um número inteiro de vezes, você pode usar a multiplicação sobrecarregada:
Portanto, para repetir uma sequência até que ela tenha pelo menos o comprimento desejado, calcule o número apropriado de repetições e coloque-o no lado direito desse operador de multiplicação:
Em seguida, você pode apará-lo no comprimento exato desejado com uma fatia da matriz:
Como alternativa, conforme sugerido na resposta do pillmod, que provavelmente ninguém rola mais o suficiente para notar, você pode usar
divmod
para calcular o número de repetições completas necessárias e o número de caracteres extras, tudo de uma vez:Qual é melhor? Vamos compará-lo:
Então, a versão do pillmod é algo 40% mais lento, o que é muito ruim, já que pessoalmente acho que é muito mais legível. Existem várias razões possíveis para isso, começando com a compilação de cerca de 40% mais instruções de bytecode.
Nota: esses exemplos usam o
//
operador new-ish para truncar a divisão inteira. Isso geralmente é chamado de recurso Python 3, mas, de acordo com o PEP 238 , foi introduzido no Python 2.2. Você só precisa usá-lo no Python 3 (ou nos módulos que o possuemfrom __future__ import division
), mas pode usá-lo independentemente.fonte
Isso é bastante pitônico:
fonte
0:7
se você quiser 7 caracteres como OP.fonte
fonte
Talvez não seja a solução mais eficiente, mas certamente curta e simples:
Dá "foobarfoobarfo". Uma coisa sobre esta versão é que, se length <len (string), a string de saída será truncada. Por exemplo:
Dá "foo".
Edit: na verdade, para minha surpresa, isso é mais rápido que a solução atualmente aceita (a função 'repeat_to_length'), pelo menos em strings curtas:
Presumivelmente, se a corda fosse longa ou o comprimento fosse muito alto (isto é, se o desperdício da
string * length
peça fosse alto), o desempenho seria fraco. E, de fato, podemos modificar o acima para verificar isso:fonte
E se
string * (length / len(string)) + string[0:(length % len(string))]
fonte
length / len(string)
precisa ser invólucro entre parênteses, e você está perdendo o último]
.//
para a divisão inteira no Python 3. A0
emenda é opcional. (O cólon é necessário, é claro.)Eu uso isso:
fonte
Não que não tenha havido respostas suficientes para essa pergunta, mas há uma função de repetição; só precisa fazer uma lista e juntar a saída:
fonte
"abc", 4
, esperaria"abca"
. Isso criariaabcabcabcabc
Yay recursão!
Não será escalado para sempre, mas é bom para cordas menores. E é bonito.
Admito que acabei de ler o Little Schemer e gosto de recursão agora.
fonte
Essa é uma maneira de fazer isso usando uma compreensão de lista, embora seja cada vez mais inútil à medida que o comprimento da
rpt
string aumenta.fonte
Outra abordagem do FP:
fonte
fonte