Iterando cada caractere em uma string usando Python

517

Em C ++, eu posso iterar sobre um exemplo std::stringcomo 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?

Paradius
fonte

Respostas:

441

Como Johannes apontou,

for c in "string":
    #do something with c

Você pode iterar praticamente qualquer coisa em python usando a for loopconstruçã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 forloop 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())

Ver documentação oficial

hasen
fonte
14
Como uma nota, inverteu iteração é arquivados com: para c em invertida ( "string")
Akseli Palen
De qual parte da documentação você sabe que uma string é do tipo iterador?
winklerrr
dir () uma string .. você com o atributo see iter .
shadow0359
312

Se você precisar acessar o índice enquanto itera pela string, use enumerate():

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t
moinudin
fonte
9
Dica profissional: começa do zero. Se você precisa iniciá-lo de um: 1 t, 2 e, 3 s, 4 tuse o parâmetro "start":for i, c in enumerate('test', start=1)
Messa
90

Ainda mais fácil:

for c in "test":
    print c
Johannes Weiss
fonte
Eu sou um novato em Python. Por alguma razão, isso não é compilado no meu ambiente, e eu tive que colocar c entre parênteses para fazê-lo funcionar: for c in "test": print (c) Por quê?
Mauro Vanetti
7
@MauroVanetti que é quase certamente porque você está usando Python 3 e quando eu respondi a pergunta havia AFAIK única Python 2.
Johannes Weiss
37

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.

i = 0
while i < len(str):
    print str[i]
    i += 1

Mas, novamente, por que fazer isso quando as strings são inerentemente iteráveis?

for i in str:
    print i
Andrew Szeto
fonte
6
Em vez do seu primeiro loop while, você pode: for i in range (len (str)): print (str [i]) O que, na minha opinião, é melhor do que ter que gerenciar o contador por conta própria. Ainda melhor é a resposta de Marcog usando enumerar.
aiham
1
Isso pode se basear apenas no uso de C por tanto tempo, mas quase sempre acabo usando esse método C-ish. Por exemplo, eu tenho um arquivo com alguns números de 4 dígitos espalhados, todos começando com 0. Então, preciso encontrar um "0" e pegar o arquivo e os próximos 3 caracteres, e seguir em frente sem duplicar o número, se houver outro 0 a seguir. Nenhum dos métodos "for c in str" ou "for i, c in enumerate (str)" funciona porque eu preciso de controle do índice. Tenho certeza de que uma expressão regular seria muito melhor, no entanto.
gkimsey
1
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, uso xrange()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, use enumerate().
Izak
6

Bem, você também pode fazer algo interessante como este e fazer seu trabalho usando o loop for

#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
    print ( name[index] ) #just like c and c++ 

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

for e in name:
    print(e)

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

for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4

2) len () - len () O BIF é usado para descobrir o comprimento de uma determinada string

Mr. Suryaa Jha
fonte
4

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:

>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'

ou mais geralmente:

>>> ''.join(map(my_function, my_string))

onde my_function pega um valor de char e retorna um valor de char.

MikeW
fonte
2

Várias respostas aqui são usadas range. xrangegeralmente é 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.

N6151H
fonte
1
observe que isso se aplica apenas ao Python 2, que esperamos que seja uma minoria agora menor
Sam Mason
0

Se você já se deparou com uma situação em que precisa get the next char of the word using __next__(), lembre-se de criar string_iteratore 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

myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
    if char == "'":
        continue

    processedInput+=char

    if char == '[':
        next_char=word_iterator.__next__()
        while(next_char != "]"):
          processedInput+=next_char
          next_char=word_iterator.__next__()
        else:
          processedInput+=next_char
Bernardo stearns reisen
fonte