Problem Solving Through Python

|  파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

조회 수 755 추천 수 0 댓글 4
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부


For 반복문에 대한 글을 작성하다가 몇 번 날려먹었습니다 ㅠㅠ


부득이 문자열 처리 강좌를 먼저 올립니다.




1. 문자열을 인덱스로 접근하기


다들 아시다시피 파이썬에서는 문자열을 양수 또는 음수의 인덱스로 접근할 수 있고, 더 나아가 인덱스 '범위'로 접근할 수 있습니다.


string = 'Hello, world!'
print(string[3:-2])

=> 'lo, worl'



인덱스 '범위'로 접근할 때에는 인덱스와 비교하여 다음과 같은 몇 가지 장점이 있습니다.




(1) 인덱스 생략


문자열의 앞 또는 뒤의 일부분만 가져올 때 사용하는 방식입니다.


이 때 문자열의 정확한 길이를 지정하지 않아도 되므로 굉장히 유용합니다.


string = 'Hello, world!'
print(string[:5])

=> 'Hello'


string[5:len(string)]과 string[5:]는 결과적으로 동일합니다.



참고로 string[::-1]이라고 하면 문자열을 뒤집을 수 있습니다.


리스트와 달리 스트링에서는 .reverse()라는 메서드가 존재하지 않으므로 유용하게 활용할 수 있습니다.




(2) 에러의 회피


인덱스를 바로 접근하는 경우에 인덱스 범위를 벗어나면 "IndexError: string index out of range" 에러가 발생합니다.


그러나 인덱스 범위로 접근하면 이러한 오류를 미연에 방지할 수 있습니다.


s = 'hello'
print(s[10])


s = 'hello'
print(s[-10:10])


첫 번째 스크립트에서는 에러가 발생하지만, 두 번째 스크립트에서는 s[-10]과 s[10]이 존재하지 않음에도 불구하고 정상적으로 작동합니다.


시중의 일부 교재에서 이 부분에 대한 설명이 누락되어 있던데, 저처럼 엉성한 스크립트라도 일단 구동이 되도록 작성하는 것이 목표인 사람에게는 꽤나 유용합니다 ^^


심지어 문자열이 공백인 경우에도 에러를 회피할 수 있다는 것이 장점입니다.




2. 문자열을 인덱스로 접근하여 값을 할당하기?? (X)


파이썬에서는 아쉽게도 문자열을 인덱스로 접근하여 그 내용을 변경하는 함수나 메서드를 제공하지 않습니다.


따라서 var_string[3] = 'a' 이런 식의 할당은 불가능합니다.


이것이 문자열과 리스트와의 차이점입니다!!


만약 문자열을 인덱스로 접근하고 싶다면, 우선 list() 함수를 이용하여 문자열을 리스트로 변환한 후, 리스트를 인덱스로 접근하여 그 요소를 변경하고, 이를 다시 join() 함수로 합쳐서 문자열로 전환해야 합니다.

(구체적인 방법은 퀴즈의 1번 해설을 참고하세요.)


비록 문자열 인덱스에 직접적으로 접근하여 조작하는 방법은 없지만, 유사한 작업을 수행함에 있어서 다음 강좌에서 살펴볼 .replace() 메서드를 제공하고 있으며, 정규식을 이용해서도 우회적으로 목적을 달성할 수 있을 것입니다.




3. 문자열을 for 반복문으로 접근하기 


for 문에 문자열을 지정하면 1개의 글자로 된 문자열을 하나씩 가져옵니다.


for s in 'study':
    print(s, end=' ')

=> s t u d y




4. 문자열 검색 - 문자열에 특정 문자열이 포함되어 있는지 확인하기


굳이 정규식을 사용하지 않더라도 문자열에 특정 문자열이 포함되어 있는지 확인할 수 있습니다.


print('ll' in 'hello')

=> True



참고로 파이썬에서는 문자열을 찾아서 인덱스를 반환하는 .find() 메서드를 제공하고 있으며, 이는 PHP에서의 strpos() 함수와 유사한 기능합니다.


PHP에서 if (strpos("검색할 대상인 문자열", "찾고 싶은 문자열") !== false) {} 이런 식으로 문자열 포함 여부를 확인한다면, 파이썬에서는 보다 직접적인 방법을 제공하고 있다고 하겠습니다.


.find() 메서드의 활용법에 대해서는 다음 강좌에서 살펴보겠습니다.




5. Quiz


문자열이 매개변수로 주어졌을 때 문자열에서 'a'를 'x'로 변경하고 이를 리턴하는 func 함수를 작성하시오.



해설:


1) 리스트로 변환한 후 인덱스로 접근하여 합치는 방법

def func(str):
    s_list = list(str)
    for i in range(len(s_list)):
        if s_list[i] == 'a':
            s_list[i] = 'x'
    return ''.join(s_list) # 리스트를 join()으로 합쳐서 문자열로 변환합니다.



2) 리스트로 변환하지 않고 for문으로 스트링을 더해주는 방법

def func(str):
    result = ''
    for c in str:
        if c == 'a':
            c = 'x'
        result += c # 문자열 더하기를 이용합니다.
    return result



위 방법을 응용하면 예컨대 전화번호의 '-'를 '.' 또는 ''로 변경하는 경우에 굳이 정규표현식을 사용하지 않고서도 빠른 변환이 가능할 것입니다.




6. 마치며


지금까지 문자열에 대한 접근 및 검색방법에 대해 살펴보았습니다.


다음 강좌에서는 문자열과 관련된 파이썬의 기본 메서드에 대해 살펴보겠습니다.


부족한 강좌를 읽어주셔서 감사합니다 ^^


  • profile
    title: 황금 서버 (30일)humit 2019.12.11 16:15
    2. 문자열을 인덱스로 접근하여 값을 할당하기??
    => 이 부분에 좀 더 첨언을 하자면 문자열의 경우에는 Immutable 이기 때문에 인덱스로 수정이 불가하지만, 리스트의 경우에는 Mutable이기 때문에 인덱스로 수정이 가능합니다.
  • profile
    이니스프리 2019.12.11 18:22
    그게 개념상 immutable과 mutable의 차이었군요~
    저는 그런 개념을 몰라서 그냥 암기했는데 덕분에 잘 이해했습니다!
    감사합니다 ^o^
  • profile
    맛스타 2019.12.12 09:14
    인덱스에서 범위로 지정하면 오류가 나지 않는 사실을 처음 일았습니다.
    유용한 팁이네요!
  • profile
    이니스프리 2019.12.12 12:24

    일부 코딩사이트에서 문제를 풀 때 try ~ except 문을 사용하면 시간초과가 뜨는 경우가 많던데, 저런 방식으로 에러를 회피하더군요~

    맛스타 님께서도 즐겁고 뜻깊은 연말 되세요!


Problem Solving Through Python

파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

List of Articles
번호 제목 글쓴이 날짜 조회 수
22 22. [OpenPyXL] 엑셀 문서 저장하기 / 시트 추가하기 / 셀에 입력하기 14 file 이니스프리 2020.02.02 219
21 21. [OpenPyXL] 엑셀 문서를 열고 시트에서 셀의 값을 얻기 2 file 이니스프리 2020.02.01 97
20 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() file 이니스프리 2020.01.16 158
19 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 file 이니스프리 2020.01.12 145
18 [Requests] Selenium을 이용한 Cloudflare의 우회 3 file 이니스프리 2020.01.08 164
17 9. 파이썬 문법 팁 정리 file 이니스프리 2020.01.04 144
16 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 file 이니스프리 2019.12.25 214
15 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 file 이니스프리 2019.12.12 155
14 6. 리스트와 관련된 기본함수 및 메서드 7 file 이니스프리 2019.12.10 191
» 3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 file 이니스프리 2019.12.09 755
12 [Selenium] Requests의 session을 Selenium으로 보내기 file 이니스프리 2019.12.07 210
11 1. 반복문 (1) - while 문 5 file 이니스프리 2019.12.06 132
10 (序) Python 강좌를 시작하며... 2 file 이니스프리 2019.12.05 106
9 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 file 이니스프리 2019.08.04 581
8 [번외편 - 법률] 나무위키의 서술 중 법률용어의 사용에 있어 바로잡아야 할 부분 file 이니스프리 2019.07.17 177
7 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 1 file 이니스프리 2019.07.16 412
6 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 2019.07.04 323
5 [번외편 - 아미나] Basic Youtube Title Widget 1.0에서 처음에 엑박으로 뜨는 경우의 해결책 3 file 이니스프리 2018.12.15 451
4 [번외편 - 아미나] 아미나의 회원 이미지와 관련하여 x2 3 file 이니스프리 2018.12.10 427
3 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 2018.12.07 734
목록
Board Pagination Prev 1 ... 2 Next
/ 2
서버에 요청 중입니다. 잠시만 기다려 주십시오...