Jaki jest skuteczny sposób na powtórzenie łańcucha do określonej długości? Na przykład:repeat('abc', 7) -> 'abcabca'
Oto mój obecny kod:
def repeat(string, length):
cur, old = 1, string
while len(string) < length:
string += old[cur-1]
cur = (cur+1)%len(old)
return string
Czy istnieje lepszy (bardziej pythoniczny) sposób na zrobienie tego? Może używasz rozumienia listy?
//
w Pythonie 3? Albo+1
wystarczy upuszczenie i użycie jawnego wywołania funkcji pułapu. Również uwaga: wygenerowany ciąg ma w rzeczywistości dodatkowe powtórzenie, gdy dzieli się równomiernie; dodatkowe zostaje odcięte przez połączenie. To mnie na początku pomieszało.int()
robi to samo tutaj, ale tak,//
może być mikroskopowo szybszy, ponieważ dzieli i piętro w jednym poleceniu zamiast dwóch.Odpowiedź Jasona Scheirera jest prawidłowa, ale przydałaby się jeszcze bardziej ekspozycja.
Po pierwsze, aby powtórzyć ciąg liczbowy liczbę całkowitą, możesz użyć przeciążonego mnożenia:
Tak więc, aby powtórzyć ciąg, aż będzie on co najmniej tak długi, jak chcesz, oblicz odpowiednią liczbę powtórzeń i umieść ją po prawej stronie tego operatora mnożenia:
Następnie możesz przyciąć go do odpowiedniej długości za pomocą wycinka tablicy:
Alternatywnie, jak zasugerowano w odpowiedzi pillmod, że prawdopodobnie nikt nie przewija się wystarczająco daleko, aby zauważyć, można użyć
divmod
do obliczenia liczby pełnych wymaganych powtórzeń i liczby dodatkowych znaków naraz:Który jest lepszy? Porównajmy to:
Tak więc wersja pillmod jest o około 40% wolniejsza, co jest zbyt złe, ponieważ osobiście uważam, że jest znacznie bardziej czytelna. Istnieje kilka możliwych przyczyn, zaczynając od kompilacji do około 40% więcej instrukcji kodu bajtowego.
Uwaga: w tych przykładach zastosowano
//
operator nowej isy do obcinania podziału na liczby całkowite. Jest to często nazywane funkcją Python 3, ale zgodnie z PEP 238 zostało wprowadzone od samego początku w Python 2.2. Wystarczy tylko mieć go używać w Pythonie 3 (lub w modułach, które mająfrom __future__ import division
), ale można go używać niezależnie.źródło
To jest dość pytoniczne:
źródło
0:7
jeśli chcesz 7 znaków, takich jak OP.źródło
źródło
Być może nie jest to najbardziej wydajne rozwiązanie, ale z pewnością krótkie i proste:
Daje „foobarfoobarfo”. Jedną rzeczą w tej wersji jest to, że jeśli długość <len (ciąg), to łańcuch wyjściowy zostanie obcięty. Na przykład:
Daje „foo”.
Edycja: ku mojemu zaskoczeniu jest to szybsze niż obecnie akceptowane rozwiązanie (funkcja „repeat_to_length”), przynajmniej na krótkich ciągach:
Przypuszczalnie, jeśli łańcuch
string * length
byłby długi lub długość była bardzo wysoka (to znaczy, gdyby marnotrawstwo części było wysokie), to działałoby to słabo. W rzeczywistości możemy zmodyfikować powyższe, aby to zweryfikować:źródło
Co powiesz na
string * (length / len(string)) + string[0:(length % len(string))]
źródło
length / len(string)
musi być owinięty w nawiasie, a brakuje Ci ostatniego]
.//
do dzielenia liczb całkowitych w Pythonie 3.0
Łączenie jest opcjonalne. (Oczywiście wymagany jest dwukropek.)używam tego:
źródło
Nie chodzi o to, że nie ma wystarczających odpowiedzi na to pytanie, ale istnieje funkcja powtarzania; wystarczy zrobić listę, a następnie dołączyć wynik:
źródło
"abc", 4
się spodziewać"abca"
. To by stworzyłoabcabcabcabc
Tak, rekurencja!
Nie będzie skalować na zawsze, ale jest w porządku dla mniejszych strun. I to jest ładne.
Przyznaję, że właśnie przeczytałem Little Schemer i lubię teraz rekursję.
źródło
Jest to jeden ze sposobów, aby to zrobić przy użyciu listy, chociaż jest to coraz bardziej marnotrawne wraz ze wzrostem długości
rpt
łańcucha.źródło
Kolejne podejście do FP:
źródło
źródło