파이썬을 사용하여 문자열의 각 문자를 반복


517

C ++에서는 다음 std::string과 같이 반복 할 수 있습니다 .

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

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

파이썬에서 문자열을 어떻게 반복합니까?

답변:


441

요하네스가 지적했듯이

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

for loop구문을 사용하여 파이썬에서 거의 모든 것을 반복 할 수 있습니다 .

예를 들어, open("file.txt")파일 객체를 반환하고 파일을 열고 해당 파일의 행을 반복하여 반복합니다.

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

그것이 마술처럼 보인다면, 그것은 다소 있지만, 그 배후의 아이디어는 정말 간단합니다.

for루프가 작동 하도록 모든 종류의 객체에 적용 할 수있는 간단한 반복자 프로토콜이 있습니다 .

next()메소드 를 정의하는 반복자를 구현 __iter__하고 클래스에서 메소드를 구현하여 반복 가능하게하십시오. ( __iter__물론 반복자 객체, 즉을 정의하는 객체를 반환해야 함 next())

공식 문서를 참조하십시오


14
참고로, 역 반복은 다음과 같이 보관됩니다 : for c in reversed ( "string")
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
전문가 팁 : 0부터 시작합니다. 하나에서 시작해야하는 경우 : 1 t, 2 e, 3 s, 4 t매개 변수를 사용하여 "시작"for i, c in enumerate('test', start=1)
메사

90

더 쉬운 방법 :

for c in "test":
    print c

저는 파이썬 초보자입니다. 어떤 이유로, 이것은 내 환경에서 컴파일되지 않으며 작동하도록 c를 대괄호로 묶어야했습니다. for c in "test": print (c) 왜?
Mauro Vanetti

7
@MauroVanetti 그것은 파이썬 3을 사용하고 있기 때문에 거의 확실합니다. 그리고 질문에 대답했을 때 AFAIK만이 파이썬 2였습니다.
Johannes Weiss

37

좀 더 포괄적 인 대답을하기 위해, 사각 페그를 둥근 구멍에 강제로 밀어 넣고 싶다면 문자열을 반복하는 C 방식을 파이썬에 적용 할 수 있습니다.

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의 대답이 더 좋습니다.
aiham

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

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)

이것은 동일한 결과를 생성하고 더 좋아 보이고 목록, 튜플 및 사전과 같은 모든 시퀀스에서 작동합니다.

우리는 내장 함수 (Python Community의 BIF)를 견인했습니다.

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
이것은
Sam Mason

0

당신이 필요로하는 상황에서 실행한다면 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.