Итерация каждого символа в строке с использованием Python - PullRequest
482 голосов
/ 11 февраля 2009

В C ++ я могу перебрать std::string следующим образом:

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

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

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

Ответы [ 8 ]

404 голосов
/ 11 февраля 2009

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

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())

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

294 голосов
/ 28 декабря 2010

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

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t
87 голосов
/ 11 февраля 2009

Еще проще:

for c in "test":
    print c
36 голосов
/ 17 февраля 2009

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

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

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

for i in str:
    print i
4 голосов
/ 20 мая 2017

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

#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 используется для определения длины заданной строки

3 голосов
/ 18 декабря 2015

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

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

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

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

или, в более общем случае:

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

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

2 голосов
/ 05 ноября 2018

Вы можете использовать форматированные строковые литералы ( PEP498 ; Pyton 3.6+) с print и последовательностью распаковки и enumerate:

print(*(f'{idx} {char}' for idx, char in enumerate('Hello!')), sep='\n')

0 H
1 e
2 l
3 l
4 o
5 !

Если достаточно печати tuple значений, генераторное выражение не нужно:

print(*enumerate('Hello!'), sep='\n')

(0, 'H')
(1, 'e')
(2, 'l')
(3, 'l')
(4, 'o')
(5, '!')
2 голосов
/ 27 сентября 2017

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

...