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

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

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

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

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


person Paradius    schedule 11.02.2009    source источник


Ответы (9)


Как указал Йоханнес,

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

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

person hasen    schedule 11.02.2009
comment
В качестве примечания, обратная итерация архивируется с: для c в обратном (строка) - person Akseli Palén; 13.07.2012
comment
Из какой части документации вы знаете, что строка является типом итератора? - person winklerrr; 01.03.2017
comment
dir () строка ... вы с атрибутом see iter. - person shadow0359; 10.04.2017

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

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t
person moinudin    schedule 28.12.2010
comment
Совет профессионала: все начинается с нуля. Если вам нужно запустить его с одного: 1 t, 2 e, 3 s, 4 t используйте параметр start: for i, c in enumerate('test', start=1) - person Messa; 21.04.2017

Еще проще:

for c in "test":
    print c
person Johannes Weiss    schedule 11.02.2009
comment
Я новичок в Python. По какой-то причине это не компилируется в моей среде, и мне пришлось заключить c в скобки, чтобы это работало: for c in "test": print (c) Почему? - person Mauro Vanetti; 03.09.2014
comment
@MauroVanetti, это почти наверняка, потому что вы используете Python 3, и когда я ответил на вопрос, AFAIK был только Python 2. - person Johannes Weiss; 03.09.2014

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

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

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

for i in str:
    print i
person Andrew Szeto    schedule 17.02.2009
comment
Вместо первого цикла while вы можете: for i in range (len (str)): print (str [i]) Что, на мой взгляд, лучше, чем управлять счетчиком самостоятельно. Еще лучше ответ Marcog с использованием enumerate. - person aiham; 13.04.2011
comment
Это может быть основано на том, что я так долго использовал C, но я почти всегда в конечном итоге использую этот C-ish метод. Например, у меня есть файл с разбросанными по сторонам 4-значными числами, все из которых начинаются с 0. Поэтому мне нужно найти 0, взять его и следующие 3 символа и двигаться дальше, не дублируя число, если есть еще 0. следуя за ним. Ни один из методов for c в str или для i, c в перечислении (str) не работает, потому что мне нужен контроль над индексом. Я уверен, что регулярное выражение было бы намного лучше. - person gkimsey; 13.03.2013
comment
for i in range(len(...)) это зло. В python 2.x range() создает список, поэтому для очень большой длины вы можете выделить очень большой блок памяти. По крайней мере, в таких случаях используйте xrange(). Кроме того, повторное индексирование одной и той же строки намного медленнее, чем итерация непосредственно по строке. Если вам нужен индекс, используйте enumerate(). - person izak; 07.06.2016

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

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

Ответ

M r . S u r y a a

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

for e in name:
    print(e)

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

Мы использовали две встроенные функции (BIF в сообществе Python)

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

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

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

person Mr. Suryaa Jha    schedule 20.05.2017

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

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

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

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

или в более общем плане:

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

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

person MikeW    schedule 18.12.2015

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

person N6151H    schedule 27.09.2017
comment
обратите внимание, что это относится только к Python 2, который, надеюсь, сейчас сокращается в меньшинстве - person Sam Mason; 11.11.2019

Вы также можете сделать следующее:

txt = "Hello World!"
print (*txt, sep='\n')

Это не использует циклы, но внутренняя инструкция print заботится об этом.

* распаковывает строку в список и отправляет его в оператор печати

sep='\n' гарантирует, что следующий символ будет напечатан на новой строке

Результатом будет:

H
e
l
l
o
 
W
o
r
l
d
!

Если вам нужен оператор цикла, то, как уже упоминалось другими, вы можете использовать цикл for следующим образом:

for x in txt: print (x)
person Joe Ferndz    schedule 09.01.2021

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

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

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

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
person Bernardo stearns reisen    schedule 29.04.2020