파이썬 자료구조 :: 문자열 str



    프로그래머스 기초 단계를 풀면서 자료구조가 많이 부족함을 느껴서 정리를 해볼려고 한다. 

    [문자열 str 정리편]







    참고 사이트 : 제대로 파이썬 (위키독스)실용 파이썬 프로그래밍(위키독스)



    Sequence 타입 객체 

    Sequence 타입에는 list, tuple, str 이 있다. 

    순서가 있어서 인덱스를 활용해서 요소를 뽑을 수 있다. (인덱싱)

    인덱스 슬라이싱, +  * 연산이 가능하고,

    객체.count(value), 객체.index(value) 메서드가 가능하다. 

    (non - Sequence 타입에는 dict, set 이 해당됨)



    str

    문자열, sequence 타입으로 순서가 있다.

    리스트와 달리 일부 값을 변경하지 못한다 (immutable 객체) 

    +) str() 문자열 형변환 



    str 인덱싱, 슬라이싱 

    a[0], a[3] 

    a[0] + a[3] 

    a[ : 3], a[2 : 5], a[2 : ], a[ : ], a[-3 : ] ~부터 ~까지

    a[-1], a[-3] 뒤에서 -n번째 출력

    a[ : : 2 ] 2칸씩 스텝(간격) 

    a[ : : -1] 역순출력 


    a[start : stop : step] 문자열도 리스트와 같이 이러한 형식을 가진다.  

    프로그래머스 Day 10 - 세로읽기 문제

    인덱스 슬라이싱 형식을 활용해서 아래와 같이 정말 간단하게 풀 수 있다. 

    def solution(s, m, c):
        return s[c-1::m]


    프로그래머스 Day 10 - qr code 문제  

     

    def solution(q, r, code):
        return code[r::q]




    str 뒤집기 (주의사항) 

    프로그래머스 Day 10 - 문자열 뒤집기 문제 

    문제설명 : 문자열 my_string과 정수 s, e가 매개변수로 주어질 때, my_string에서 인덱스 s부터 인덱스 e까지를 뒤집은 문자열을 return 하는 solution 함수를 작성해 주세요.

    정답코드 

    def solution(st, s, e):
        return st[:s] + st[s:e+1][::-1] + st[e+1:]
    인덱스 슬라이싱으로 문자열을 s에서 부터, e+1까지 뒤집을때 st[s : e+1 : -1] 이렇게 쓰면 안된다. 

    시작시점이랑 끝나는 지점을 바꿔서 뒤에서 하나씩 출력하는 거기 때문에 

    st[s : e+1][ : : -1] 이렇게 표현해야한다. 






    -----------------------------------



    str 연산하기

    + 더하기

    문자열을 변경이 불가능한 객체라서 str[3] = 'a' 이렇게 인덱스에 접근해 값을 바꾸는게 안되지만, 

    더하기 연산과 인덱스 슬라이싱을 활용해서 값을 바꾸는건 가능하다. 

    # 이어붙이기(+)
    a = 'Hello' + 'World'   # 'HelloWorld'
    b = 'Say ' + a          # 'Say HelloWorld'


    # 인덱스 슬라이싱을 사용하여 문자열 일부 변경
    s = "Hello, World!"
    new = s[:7] + "Python" + s[12:]  # "World" 부분을 "Python"으로 대체
    print(new) # 출력 "Hello, Python!"


    * 반복하기 

    s = 'Hello'
    rep = s * 5             # 'HelloHelloHelloHelloHello'


    in / not in 멤버 연산자

    value in group(str, list,,,) 값이 포함되어 있는지 아닌지 확인 
    s = 'Hello'
    t = 'e' in s            # True
    f = 'x' in s            # False
    g = 'hi' not in s       # True




    -----------------------------------


    str 스트링 

    raw string

    상황 : 특수문자가 포함된 문자열을 출력할때 
    효과 : r을 붙인 문자열 안의 모든 특수 문자에 자동으로 \이 추가로 붙여져, \n, \', \" 으로 치환됨

    문법 : 문자열 다음표 맨앞에 r 을 붙인다. 
    예시 : print(r"!@#$%^&*(":;?") -> 특수문자가 포함되더라도 온전하게 출력됨 



    f string

    상황 : 문자열 포매팅을 할때
    효과 : 문자열과 변수, 수식연산이 필요한 표현식 등을 구분지어 쓰지않고, 한 줄로 표현 가능 

    문법 : 문자열 맨앞에 f를 붙이고, 문자열 안에서는 중괄호를 써서 넣고싶은 변수나 표현식을 넣으면됨 
    예시 : print(f"a={3+4} \n b={b}")



    -----------------------------------



    str 메서드

    ① count 

    str.count(value) 

    문자열에서 해당 value값의 요소가 몇개인지 갯수 조사 



    ② 인덱스 검색 (find / index)

    str.find(value) str.index(value) 

    find 메서드, index 메서드 둘다 인덱스 위치를 찾을때 사용하는 것인데,

    index 메서드과 맞춤화된게 아니라서, 찾는 값이 문자열에 없으면 오류를 반환한다.

    대신, find 메서드는 찾는 값이 문자열에 없으면 -1를 반환하는 차이가 있다. 

    s.find(t)               # s에서 t가 처음 나타나는 곳

    s.index(t)             # s에서 t가 처음 나타나는 곳

    s.rfind(t)              # 문자열의 끝에서부터 t를 검색

    s.rindex(t)            # 문자열의 끝에서부터 t를 검색


    프로그래머스 Day 11 - 가까운 1 찾기 문제 

    index 함수를 활용해서 간단하게 위의 문제를 풀 수 있다. 

    #index 함수 활용, 시작인덱스는 idx 
    def solution(arr, idx):
        answer = 0
        try:
            answer = arr.index(1, idx)
        except:
            answer = -1
        return answer





    ③ 접두사, 접미사 확인 (startswith / endswith) 

    s.startswith(prefix)     # 문자열이 prefix로 시작하는지 확인 = 접두사

    s.endswith(suffix)     # 문자열이 suffix로 끝나는지 확인 = 접미사


    바나나 banana 문자열의 접미사를 확인하는 문제이다. endswith 메서드로 해결가능

    def solution(my_string, is_suffix):
        return int(my_string.endswith(is_suffix))


    접두사를 확인하는 문제에서는 startswith 메서드로 해결할 수 있다. 

    def solution(my_string, is_prefix):
        return int(my_string.startswith(is_prefix))


    매개변수로 오는 is_suffix 혹은 is_prefix 는 확인할 접미사/접두사를 뜻함 


    strartswith 메서드를 활용한 문제가 또 있다. 

    문자열이 몇 번 등장하는지 세기


    겹치는 인덱스가 있어서 count 메서드를 쓰면 값이 틀리게 나온다. 

    그래서, 인덱스 하나 하나씩 체크해야한다. 

    내가 작성한 코드는 아래처럼, if문으로 값을 확인하는 방식인데 startswith으로 바꿀수가 있다. 


    내가 작성한 코드  

    def solution(myString, pat):
        count = 0 
        for i in range(len(myString)) : 
            if myString[i:i+len(pat)] == pat : 
                count += 1
        return count 


    startswith 메서드를 활용한 코드 

    def solution(myString, pat):
        answer = 0
        for i, x in enumerate(myString) :
            if myString[i:].startswith(pat) :
                answer += 1
        return answer 





    ④ 여부 확인 (isalpha / isdigit / islower / isupper) 

    s.isalpha()             # 문자가 영문자인지 여부

    s.isdigit()             # 문자가 숫자인지 여부

    s.islower()            # 문자가 소문자인지 여부

    s.isupper()           # 문자가 대문자인지 여부



    ⑤ 대소문자로 변환 (lower / upper)

    s.lower()              # 소문자로 변환

    s.upper()              # 대문자로 변환



    ⑥ 텍스트 교체 (replace) 

    s.replace(old, new)     # 텍스트 교체



    ⑦ 붙이기 (join) 

    s.join(slist)          # s를 구분자(delimiter)로 삼아 문자열의 리스트를 붙이기(join)



    ⑧ 공백제거 (strip / lstrip / rstrip)

    s.strip() # 앞 뒤의 공백을 제거

    s.lstrip() # 왼쪽 공백 지우기

    s.rstrip() # 오른쪽 공백 지우기



    ⑨ 분활 (split)

    s.split([구분자])       # 문자열을 분할해 부분 문자열의 리스트를 만듦





    댓글

    이 블로그의 인기 게시물

    [KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

    KT 에이블스쿨 : IT 인프라 (1일차~5일차) 공부 정리

    KT 에이블스쿨 : 핀테크 아이디어 공모전