Quel est un moyen efficace de répéter une chaîne à une certaine longueur? Par exemple:repeat('abc', 7) -> 'abcabca'
Voici mon code actuel:
def repeat(string, length):
cur, old = 1, string
while len(string) < length:
string += old[cur-1]
cur = (cur+1)%len(old)
return string
Existe-t-il une meilleure façon (plus pythonique) de procéder? Peut-être en utilisant la compréhension de liste?
//
en Python 3? Ou laisser tomber+1
et utiliser un appel explicite à une fonction de plafond suffirait. Aussi, une remarque: la chaîne générée a en fait une répétition supplémentaire lorsqu'elle se divise uniformément; le surplus est coupé par l'épissure. Cela m'a dérouté au début.int()
fait la même chose ici, mais oui,//
pourrait être microscopiquement plus rapide, car il fait la division et le plancher en une seule commande au lieu de deux.La réponse de Jason Scheirer est correcte mais pourrait utiliser un peu plus d'exposé.
Tout d'abord, pour répéter une chaîne un nombre entier de fois, vous pouvez utiliser une multiplication surchargée:
Donc, pour répéter une chaîne jusqu'à ce qu'elle soit au moins aussi longue que la longueur souhaitée, vous calculez le nombre approprié de répétitions et la placez sur le côté droit de cet opérateur de multiplication:
Ensuite, vous pouvez le couper à la longueur exacte que vous souhaitez avec une tranche de tableau:
Alternativement, comme suggéré dans la réponse de pillmod que personne ne fait probablement défiler suffisamment pour remarquer, vous pouvez utiliser
divmod
pour calculer le nombre de répétitions complètes nécessaires et le nombre de caractères supplémentaires, à la fois:Ce qui est mieux? Essayons de le comparer:
Donc, la version de pillmod est quelque chose comme 40% plus lente, ce qui est dommage, car personnellement, je pense que c'est beaucoup plus lisible. Il y a plusieurs raisons possibles à cela, à commencer par sa compilation avec environ 40% d'instructions de bytecode supplémentaires.
Remarque: ces exemples utilisent l'
//
opérateur new-ish pour tronquer la division entière. Ceci est souvent appelé une fonctionnalité Python 3, mais selon PEP 238 , elle a été introduite tout au long de Python 2.2. Vous n'avez qu'à l'utiliser en Python 3 (ou dans les modules qui l'ontfrom __future__ import division
) mais vous pouvez l' utiliser malgré tout.la source
C'est assez pythonique:
la source
0:7
si vous voulez 7 caractères comme OP.la source
la source
Peut-être pas la solution la plus efficace, mais certainement courte et simple:
Donne "foobarfoobarfo". Une chose à propos de cette version est que si la longueur <len (chaîne) alors la chaîne de sortie sera tronquée. Par exemple:
Donne "foo".
Edit: à ma grande surprise, c'est plus rapide que la solution actuellement acceptée (la fonction 'repeat_to_length'), du moins sur les chaînes courtes:
Vraisemblablement, si la chaîne était longue ou si la longueur était très élevée (c'est-à-dire si le gaspillage de la
string * length
pièce était élevé), elle fonctionnerait mal. Et en fait, nous pouvons modifier ce qui précède pour vérifier cela:la source
Que diriez-vous
string * (length / len(string)) + string[0:(length % len(string))]
la source
length / len(string)
doit être enveloppé entre parenthèses, et vous manquez le dernier]
.//
pour la division entière en Python 3. Le0
dans l'épissure est facultatif. (Le colon est obligatoire, bien sûr.)j'utilise ceci:
la source
Non pas qu'il n'y ait pas eu assez de réponses à cette question, mais il y a une fonction de répétition; suffit de faire une liste puis de rejoindre la sortie:
la source
"abc", 4
je m'attendrais"abca"
. Cela créeraitabcabcabcabc
Ouais récursivité!
N'augmentera pas pour toujours, mais c'est bien pour les petites cordes. Et c'est joli.
J'avoue que je viens de lire le Little Schemer et j'aime la récursivité en ce moment.
la source
C'est une façon de le faire en utilisant une compréhension de liste, bien que cela devienne de plus en plus inutile à mesure que la longueur de la
rpt
chaîne augmente.la source
Une autre approche de la PF:
la source
la source