W C ++ mogę iterować w następujący sposób std::string
:
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
Jak iterować po ciągu znaków w Pythonie?
Jak zauważył Johannes,
for c in "string":
#do something with c
Za pomocą for loop
konstruktu możesz iterować prawie wszystko w pythonie ,
na przykład open("file.txt")
zwraca obiekt pliku (i otwiera plik), iteracja po nim iteracja po liniach w tym pliku
with open(filename) as f:
for line in f:
# do something with line
Jeśli to wydaje się być magią, to w pewnym sensie jest, ale pomysł za tym jest naprawdę prosty.
Istnieje prosty protokół iteratora, który można zastosować do dowolnego obiektu, aby for
pętla na nim działała.
Wystarczy zaimplementować iterator, który definiuje next()
metodę, i zaimplementuj __iter__
metodę na klasie, aby była iterowalna. ( __iter__
oczywiście powinien zwrócić obiekt iteratora, czyli obiekt, który definiuje next()
)
Jeśli potrzebujesz dostępu do indeksu podczas iteracji po ciągu, użyj
enumerate()
:źródło
1 t
,2 e
,3 s
,4 t
użyj parametru "start":for i, c in enumerate('test', start=1)
Jeszcze łatwiej:
źródło
for c in "test": print (c)
Dlaczego?Aby uzyskać bardziej wyczerpującą odpowiedź, w języku Python można zastosować metodę C iteracji po łańcuchu, jeśli naprawdę chcesz zmusić kwadratowy kołek do okrągłego otworu.
Ale z drugiej strony, po co to robić, skoro ciągi są z natury iterowalne?
źródło
for i in range(len(...))
jest zły. W Pythonie 2.xrange()
tworzy listę, więc na bardzo dużej długości możesz skończyć przydzielaniem bardzo dużego bloku pamięci. Przynajmniej użyjxrange()
w tych przypadkach. Ponadto wielokrotne indeksowanie tego samego łańcucha jest znacznie wolniejsze niż iteracja bezpośrednio nad nim. Jeśli potrzebujesz indeksu, użyjenumerate()
.Możesz także zrobić coś takiego interesującego i wykonać swoją pracę za pomocą pętli for
Odpowiedź to
Pan . Sryaa
Ponieważ jednak range () tworzy listę wartości, która jest sekwencją, więc możesz bezpośrednio użyć nazwy
Daje to również ten sam wynik, a także wygląda lepiej i działa z dowolną sekwencją, taką jak lista, krotka i słownik.
Użyliśmy holowania Wbudowane funkcje (BIF w Python Community)
1) range () - range () BIF służy do tworzenia indeksów Przykład
2) len () - len () BIF służy do ustalenia długości danego łańcucha
źródło
Jeśli chcesz zastosować bardziej funkcjonalne podejście do iteracji po łańcuchu (być może w jakiś sposób go przekształcić), możesz podzielić łańcuch na znaki, zastosować funkcję do każdego z nich, a następnie dołączyć wynikową listę znaków z powrotem do łańcucha.
Ciąg znaków jest z natury listą znaków, dlatego „map” będzie iterował ciąg znaków - jako drugi argument - stosując funkcję - pierwszy argument - do każdego z nich.
Na przykład tutaj używam prostego podejścia lambda, ponieważ wszystko, co chcę zrobić, to trywialna modyfikacja postaci: tutaj, aby zwiększyć wartość każdej postaci:
lub bardziej ogólnie:
gdzie moja_funkcja przyjmuje wartość char i zwraca wartość char.
źródło
Wykorzystuje się tutaj kilka odpowiedzi
range
.xrange
jest ogólnie lepszy, ponieważ zwraca generator, a nie listę z pełną instancją. Tam, gdzie problemem może być pamięć i iteracje o bardzo różnych długościach,xrange
jest lepsza.źródło
Jeśli kiedykolwiek spotkasz się z sytuacją, w której musisz
get the next char of the word using __next__()
, pamiętaj o utworzeniustring_iterator
i iteruj nad nim, a nieoriginal string (it does not have the __next__() method)
W tym przykładzie, gdy znajduję znak =
[
szukam następnego słowa, dopóki go nie znajduję]
, więc muszę użyć __next__tutaj pętla for nad łańcuchem nie pomogłaby
źródło