Em C ++, eu posso iterar sobre um exemplo std::string
como este:
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
Como iterar sobre uma string em Python?
Como Johannes apontou,
for c in "string":
#do something with c
Você pode iterar praticamente qualquer coisa em python usando a for loop
construção,
por exemplo, open("file.txt")
retorna um objeto de arquivo (e abre o arquivo), iterando sobre ele itera sobre linhas nesse arquivo
with open(filename) as f:
for line in f:
# do something with line
Se isso parece mágica, bem, é meio, mas a idéia por trás disso é realmente simples.
Existe um protocolo iterador simples que pode ser aplicado a qualquer tipo de objeto para fazer o for
loop funcionar nele.
Simplesmente implemente um iterador que define um next()
método e implemente um __iter__
método em uma classe para torná-lo iterável. (é __iter__
claro, deve retornar um objeto iterador, ou seja, um objeto que define next()
)
Se você precisar acessar o índice enquanto itera pela string, use
enumerate()
:fonte
1 t
,2 e
,3 s
,4 t
use o parâmetro "start":for i, c in enumerate('test', start=1)
Ainda mais fácil:
fonte
for c in "test": print (c)
Por quê?Apenas para obter uma resposta mais abrangente, a maneira C de iterar sobre uma string pode ser aplicada no Python, se você realmente deseja forçar um pino quadrado em um buraco redondo.
Mas, novamente, por que fazer isso quando as strings são inerentemente iteráveis?
fonte
for i in range(len(...))
é mau. No python 2.x,range()
cria uma lista; portanto, por um período muito longo, você pode acabar alocando um bloco muito grande de memória. No mínimo, usoxrange()
nesses casos. Além disso, a indexação repetida da mesma sequência é muito mais lenta que a iteração diretamente sobre a sequência. Se você precisar do índice, useenumerate()
.Bem, você também pode fazer algo interessante como este e fazer seu trabalho usando o loop for
A resposta é
Senhor . S uryaa
No entanto, como range () cria uma lista dos valores que são sequência, portanto, você pode usar diretamente o nome
Isso também produz o mesmo resultado e também parece melhor e funciona com qualquer sequência, como lista, tupla e dicionário.
Usamos tow Built in Functions (BIFs na Comunidade Python)
1) range () - range () O BIF é usado para criar índices Exemplo
2) len () - len () O BIF é usado para descobrir o comprimento de uma determinada string
fonte
Se você quiser usar uma abordagem mais funcional para iterar sobre uma sequência (talvez para transformá-la de alguma forma), poderá dividir a sequência em caracteres, aplicar uma função a cada uma delas e, em seguida, ingressar na lista resultante de caracteres novamente em uma sequência.
Uma string é inerentemente uma lista de caracteres; portanto, 'map' iterará sobre a string - como segundo argumento - aplicando a função - o primeiro argumento - a cada um.
Por exemplo, aqui eu uso uma abordagem lambda simples, pois tudo o que eu quero fazer é uma modificação trivial no caractere: aqui, para incrementar o valor de cada caractere:
ou mais geralmente:
onde my_function pega um valor de char e retorna um valor de char.
fonte
Várias respostas aqui são usadas
range
.xrange
geralmente é melhor, pois retorna um gerador, em vez de uma lista totalmente instanciada. Onde a memória e / ou iteráveis de comprimentos muito variados podem ser um problema,xrange
é superior.fonte
Se você já se deparou com uma situação em que precisa
get the next char of the word using __next__()
, lembre-se de criarstring_iterator
e iterar sobre ela, e não ooriginal string (it does not have the __next__() method)
Neste exemplo, quando encontro um char =
[
, continuo pesquisando a próxima palavra enquanto não o encontro]
, por isso preciso usar __next__aqui um loop for sobre a corda não ajudaria
fonte