2013-08-14 17 views
15

Powiedz, że mam ciąg znaków s = 'BINGO'; Chcę iterować przez ciąg znaków, aby uzyskać 'B I N G O'.Python dodawanie spacji między znakami w łańcuchu. Najbardziej efektywny sposób

To co zrobiłem:

result = '' 
for ch in s: 
    result = result + ch + ' ' 
print(result[:-1]) # to rid of space after O 

Czy jest bardziej efektywny sposób, aby przejść na ten temat?

+3

na moim komputerze, to trwa około 500ns. Czy to naprawdę wąskie gardło w twoim programie? Jeśli nie, nie pytaj o wydajność; zapytaj o prostotę, czytelność itp. - rzeczy, które naprawdę mają znaczenie. – abarnert

+1

@abarnert być może * efektywny * oznacza coś szczególnego dla ciebie, ale nie * faktycznie * koniecznie oznacza * wydajność * maszyny. – kojiro

+0

@kojiro: "skuteczny" oznacza coś szczególnego w uczniu/zawodzie/hobby/itd. programowania komputerowego, o to właśnie chodzi w tej witrynie, a więc ta definicja ma znaczenie. Dlatego ta strona ma tag efektywności, który jest przeznaczony i używany w tym właśnie celu. – abarnert

Odpowiedz

27
s = "BINGO" 
print(" ".join(s)) 

Należy to zrobić.

+0

wyjaśnienie z dokumentacji str.join: 'S.join (iterable) -> string' Zwraca ciąg będący konkatenacją ciągów znaków w iteracji . ** Separator między elementami to S. ** –

+0

Dobrze, dokładnie prawda.Python traktuje poszczególne ciągi jako iterowalne, więc dołącza każdą spację (element w iteracji) spacją. –

+0

Jak dodać spację co drugą literę? na przykład wyjście powinno wyglądać jak "BI NG O"? –

16
s = "BINGO" 
print(s.replace("", " ")[1: -1]) 

taktowanie poniżej

$ python -m timeit -s's = "BINGO"' 's.replace(""," ")[1:-1]' 
1000000 loops, best of 3: 0.584 usec per loop 
$ python -m timeit -s's = "BINGO"' '" ".join(s)' 
100000 loops, best of 3: 1.54 usec per loop 
+1

To jest ciekawy pomysł, dlaczego metoda zamiany jest szybsza? –

+4

@MikeVella Przypuszczam, że może to wynikać z faktu, że kod źródłowy Pythona ma [specjalny przypadek zastępujący program obsługi] (https://github.com/python-git/python/blob/master/Objects/stringobject. C# L2690) do przeplatania, gdy łańcuch * od * jest pusty. – kojiro

+1

Nawiasem mówiąc, myślę, że ta odpowiedź byłaby lepsza, gdyby podała wartości 'timeit' dla kilku różnych rozmiarów napisów. – kojiro

Powiązane problemy