В C ++ я могу перебирать std::string
следующим образом:
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
Как перебрать строку в Python?
В C ++ я могу перебирать std::string
следующим образом:
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
Как перебрать строку в Python?
Как указал Йоханнес,
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()
)
Если вам нужен доступ к индексу при итерации по строке, используйте enumerate()
:
>>> for i, c in enumerate('test'):
... print i, c
...
0 t
1 e
2 s
3 t
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
for c in "test": print (c)
Почему?
- person Mauro Vanetti; 03.09.2014
Чтобы дать более исчерпывающий ответ, способ перебора строки C может применяться в Python, если вы действительно хотите вставить квадратный колышек в круглое отверстие.
i = 0
while i < len(str):
print str[i]
i += 1
Но опять же, зачем это делать, если строки по своей сути итерируемы?
for i in str:
print i
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 используется для определения длины данной строки
Если вы хотите использовать более функциональный подход к итерации по строке (возможно, чтобы как-то ее преобразовать), вы можете разбить строку на символы, применить функцию к каждому из них, а затем снова объединить полученный список символов в строку.
Строка по своей сути является списком символов, поэтому 'map' будет перебирать строку - в качестве второго аргумента - применяя функцию - первый аргумент - к каждому из них.
Например, здесь я использую простой лямбда-подход, поскольку все, что я хочу сделать, это тривиальная модификация символа: здесь, чтобы увеличить значение каждого символа:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
или в более общем плане:
>>> ''.join(map(my_function, my_string))
где my_function принимает значение char и возвращает значение char.
В нескольких ответах здесь используется range
. xrange
обычно лучше, поскольку он возвращает генератор, а не полностью созданный список. Если память и / или итерации разной длины могут быть проблемой, xrange
лучше.
Вы также можете сделать следующее:
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)
Если вы когда-либо сталкивались с ситуацией, когда вам нужно 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