Итерация каждого символа в строке с использованием Python


517

В C ++ я могу перебрать std::stringподобное:

std::string str = "Hello World!";

for (int i = 0; i < str.length(); ++i)
{
    std::cout << str[i] << std::endl;
}

Как мне перебрать строку в Python?

Ответы:


441

Как отметил Йоханнес,

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

Вы можете перебрать почти все в Python, используя for loopконструкцию,

например, open("file.txt")возвращает объект файла (и открывает файл), повторяя его итерируя по строкам в этом файле

with open(filename) as f:
    for line in f:
        # do something with line

Если это похоже на магию, ну, в общем-то, так и есть, но идея, стоящая за этим, очень проста.

Существует простой протокол итератора, который можно применить к любому объекту, чтобы forцикл работал на нем.

Просто реализуйте итератор, который определяет next()метод, и реализуйте __iter__метод в классе, чтобы сделать его итеративным. ( __iter__конечно, должен возвращать объект итератора, то есть объект, который определяет next())

Смотрите официальную документацию


14
Как примечание, обратная итерация архивируется с: для c в обратном («строка»)
Akseli Palén

Из какой части документации вы знаете, что строка является типом итератора?
winklerrr

dir () строка .. вы видите атрибут iter .
shadow0359

312

Если вам нужен доступ к индексу во время итерации по строке, используйте enumerate():

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t

9
Совет от профессионала: он начинается с нуля. Если вам необходимо запустить его из одного: 1 t, 2 e, 3 s, 4 tиспользуйте параметр «Пуск»:for i, c in enumerate('test', start=1)
Месса

90

Еще проще:

for c in "test":
    print c

Я новичок в Python. По какой-то причине это не компилируется в моей среде, и мне пришлось заключить c в скобки, чтобы это работало: for c in "test": print (c) почему?
Мауро Ванетти

7
@MauroVanetti это почти наверняка, потому что вы используете Python 3, и когда я ответил на вопрос, был AFAIK только Python 2.
Йоханнес Вайс

37

Просто чтобы дать более полный ответ, способ итерации по строке в C может применяться в Python, если вы действительно хотите вбить квадратный колышек в круглое отверстие.

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

Но опять же, зачем это делать, когда строки по своей природе итеративны?

for i in str:
    print i

6
Вместо вашего первого цикла while вы можете сделать: for i in range (len (str)): print (str [i]) Что, на мой взгляд, лучше, чем управлять счетчиком самостоятельно. Еще лучше ответ Marcog с использованием перечисления.
Айхам

1
Это может быть связано с тем, что я так долго использовал C, но я почти всегда заканчиваю тем, что использую этот метод C-ish. Например, у меня есть файл с разбросанными примерно 4-значными числами, все из которых начинаются с 0. Поэтому мне нужно найти «0», взять его и следующие 3 символа и двигаться дальше, не дублируя номер, если есть еще 0 после этого. Ни один из методов "for c in str" или "for i, c in enumerate (str)" не работает, потому что мне нужен контроль над индексом. Я уверен, что регулярное выражение будет намного лучше, хотя.
gkimsey

1
for i in range(len(...))это зло В python 2.x range()создается список, поэтому для очень большой длины вы можете выделить очень большой блок памяти. По крайней мере, использовать xrange()в этих случаях. Кроме того, повторное индексирование одной и той же строки намного медленнее, чем итерация непосредственно по строке. Если вам нужен индекс, используйте enumerate().
Изак

6

Ну, вы также можете сделать что-то интересное, как это и сделать свою работу с помощью цикла for

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

Ответ

Г-н . Сурия

Однако, так как range () создает список значений, который является последовательностью, таким образом, вы можете напрямую использовать имя

for e in name:
    print(e)

Это также дает тот же результат, а также выглядит лучше и работает с любой последовательностью, такой как список, кортеж и словарь.

Мы использовали буксировку встроенных функций (BIFs в Python Community)

1) range () - range () BIF используется для создания индексов. Пример

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

2) len () - len () BIF используется для определения длины заданной строки


4

Если вы хотите использовать более функциональный подход к итерации по строке (возможно, для ее преобразования), вы можете разбить строку на символы, применить функцию к каждому из них, а затем соединить полученный список символов обратно в строку.

Строка по своей сути является списком символов, поэтому «map» будет перебирать строку - как второй аргумент - применяя функцию - первый аргумент - к каждому.

Например, здесь я использую простой лямбда-подход, поскольку все, что я хочу сделать, - это тривиальное изменение символа: здесь, чтобы увеличить значение каждого символа:

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

или в целом:

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

где my_function принимает значение char и возвращает значение char.


2

Здесь используют несколько ответов range. xrangeобычно лучше, поскольку он возвращает генератор, а не полностью созданный список. Там, где память и / или итерации широко варьируемой длины могут быть проблемой, xrangeлучше.


1
обратите внимание, что это относится только к Python 2, который, как мы надеемся, сейчас
Сэм Мейсон

0

Если вы когда-либо сталкивались с ситуацией, когда вам это нужно get the next char of the word using __next__(), не забудьте создать string_iteratorи выполнить итерацию, а неoriginal string (it does not have the __next__() method)

В этом примере, когда я нахожу символ =, [я продолжаю искать следующее слово, пока не нахожу ], поэтому мне нужно использовать __next__

здесь цикл по строке не поможет

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.