ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8. 시퀀스 자료형 사용하기
    Python/Grammar 2022. 12. 1. 13:01

    # 1. 시퀀스 자료형의 공통기능 사용하기

    파이썬에서는 리스트, 튜플, range, 문자열처럼 값이 연속적으로 이어진 자료형을 '시퀀스(sequence)'라고 한다. 참고로 시퀀스 자료형에는 위 4가지 자료형 이외에도 byte, bytearray가 있다. 

    ※ 시퀀스 자료형을 만든 객체를 '시퀀스 객체'라고 하며, 시퀀스 객체에 들어있는 각 값을 '요소(element)'라고 한다.

    1-1. 특정 값이 있는지 확인하기

    : 시퀀스 객체에 in 연산자를 사용했을 때 특정 값이 있으면 True, 없으면 False를 반환한다. (not in 은 반대)

    • 값 in 시퀀스객체
    • 값 not in 시퀀스 객체
    >>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> 0 in a
    True
    >>> 20 not in a
    False
    
    >>> 'P' in 'Python'
    True
    >>> 'p' in 'python'
    False

     

    1-2. 시퀀스 객체 연결하기

    : 시퀀스 객체는 + 연산자를 이용해 서로 연결하여 새로운 객체를 만들어낼 수 있다. 

     ※ 단, range는 제외. range를 활용하고 싶다면 리스트 또는 튜플로 만들어서 연결하면 된다.

    >>> a = list('accuacy')
    >>> b = list('precision')
    >>> c = a + b
    >>> print(c)
    ['a', 'c', 'c', 'u', 'a', 'c', 'y', 'p', 'r', 'e', 'c', 'i', 's', 'i', 'o', 'n']
    >>> a = tuple(range(4))
    >>> b = tuple('HELLO')
    >>> c = a + b
    >>> print(c)
    (0, 1, 2, 3, 'H', 'E', 'L', 'L', 'O')
    >>> a = 'Hello,\t'
    >>> b = 'Python!'
    >>> print(a + b)
    Hello,	Python!

     

    1-3. 시퀀스 객체 반복하기

    • * 연산자로 시퀀스 객체를 특정 횟수만큼 반복해 새 시퀀스 객체를 생성
    • 0 또는 음수를 곱하면 빈 객체가 나오며, 실수는 곱할 수 없음
    • range의 경우 *를 사용하여 반복할 수 없음
    >>> print([0, 10, 20, 30] * 3)
    [0, 10, 20, 30, 0, 10, 20, 30, 0, 10, 20, 30]
    >>> print(range(10)*3)
    TypeError: unsupported operand type(s) for *: 'range' and 'int'

     

     

    # 2. 시퀀스 객체의 요소 개수 구하기

    • len(시퀀스 객체)

     

    2-1. 리스트와 튜플의 요소 개수 구하기

    >>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> len(a)
    10
    >>> b = (38, 76, 43, 62, 19)
    >>> len(b)
    5

     

    2-2. range의 숫자 생성 개수 구하기

    >>> len(range(1, 18, 2))
    9

     

    2-3. 문자열의 길이 구하기

    >>> len("Hello Python!")
    13

     

    참고. UTF-8 문자열의 바이트 수 구하기

    : UTF-8에서 한글 글자 하나는 3바이트로 표현

    >>> hello = '안녕하세요'
    >>> len(hello.encode('utf-8'))
    15

     

     

    # 3. 인덱스 사용하기

    시퀀스 객체에 대괄호를 붙이고 대괄호 안에 각 요소의 인덱스를 지정하면 해당 요소에 접근할 수 있다.

    • 시퀀스객체[인덱스]
    • list, tuple, range, 문자열 모두 인덱스로 접근 가능
    • 범위를 벗어난 인덱스를 지정하면 IndexError가 발생한다. 
    • 시퀀스 객체에서 []를 사용하면 실제로는 getitem메서드를 사용하게 된다. 따라서 대괄호 대신 __getitem__(인덱스번호)를 사용해도 된다.
    # a의 첫번째 요소(인덱스 0번) 출력
    >>> a = [38, 21, 53, 62, 19]
    >>> a[0]
    38
    # 대괄호에 인덱스를 지정해 요소에 접근하지 않고 getitem 메서드 사용
    >>> a.__getitem__(3)
    62
    # 시퀀스객체 a의 뒤에서 제일 첫번째 요소 출력
    >>> a[-1] 
    19

     

    3-1. 요소에 값 할당하기

    • 시퀀스객체[인덱스] = 값
    • 시퀀스객체 중 유일하게 list에게만 허용되는 기능(tuple, range, 문자열은 읽기전용이기 때문)
    >>> a = [0, 0, 0, 0, 0]
    >>> a[0] = 1
    >>> a[2] = 3
    >>> a
    [1, 0, 3, 0, 0]
     

     

    3-2. del로 요소 삭제하기

    • del 시퀀스객체[인덱스]
    • 시퀀스객체 중 유일하게 list에게만 허용됨(리스트만 요소에 값을 할당할 수 있는 것과 같은 이치)
    >>> a = [38, 21, 53, 62, 19]
    >>> del a[4]
    >>> a
    [38, 21, 53, 62]

     

     

    # 4. 슬라이스 사용하기

    • 시퀀스객체[시작인덱스:끝인덱스]
    • list, tuple, range, 문자열 모두 사용가능
    >>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[4:8] # 인덱스 4부터 7까지 잘라서 새 리스트를 만듦
    [40, 50, 60, 70]
    >>> a[4:4]
    []
    >>> a[4:-1] # 인덱스 4번부터 -2번까지 잘라서 새 리스트 만듦
    [40, 50, 60, 70, 80]
    >>> a[4:9:2] # 인덱스 4부터 2씩 증가시키면서 인덱스 8까지 가져옴
    [40, 60, 80]
    >>> a[:7]
    [0, 10, 20, 30, 40, 50, 60]
    >>> a[:] # a 전체 호출과 동일
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[::] # a 전체 호출과 동일
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[5:1:-1]
    [50, 40, 30, 20]
    >>> a[::-1] # 리스트 a 전체를 가져오면서 요소 배열을 반대로 뒤집음
    [90, 80, 70, 60, 50, 40, 30, 20, 10, 0]

     

    4-1. len 응용하기

    # 시작 인덱스 생략, 끝 인덱스에 len(a)지정하여 리스트 전체를 가져오기
    >>> a[:len(a)] 
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

     

    4-2. slice 객체 사용하기

    • 슬라이스 객체 = slice(끝인덱스)
    • 슬라이스 객체 = slice(시작인덱스, 끝인덱스)
    • 슬라이스 객체 = slice(시작인덱스, 끝인덱스, 인덱스 증가폭)
    • 시퀀스객체[슬라이스 객체]
    • 시퀀스객체.getitem(슬라이스객체)
    >>> range(10)[slice(3)]
    range(0, 3)
    >>> range(10).__getitem__(1)
    1
    >>> list('python')[slice(2)]
    ['p', 'y']
    >>> s = slice(4, 7)
    >>> s
    slice(4, 7, None)
    >>> a = list(range(0, 91, 10))
    >>> s = slice(4, 7) # 인덱스 4번부터 6번까지 자르는 슬라이스 객체 생성
    >>> a[s] 
    [40, 50, 60]

     

    4-3. 슬라이스에 요소 할당하기

    • 시퀀스객체[시작인덱스:끝인덱스] = 시퀀스객체
    • 양 시퀀스 객체 요소의 개수를 맞추지 않아도 됨. 단, 증가폭까지 지정할 때는 슬라이스 범위의 요소 개수와 할당할 요소 개수가 정확히 일치해야 함.
    • 읽기전용 객체인 tuple, range, 문자열은 불가능
    >>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[2:5] = ['a', 'b', 'c'] # a의 2번째 인덱스부터 4번째 인덱스까지 값 할당
    >>> a
    [0, 10, 'a', 'b', 'c', 50, 60, 70, 80, 90]
    
    >>> a[2:5] = ['a'] # a의 2번째 인덱스부터 4번째 인덱스까지 하나의 값을 할당하면 요소의 개수가 줄어듦
    >>> a
    [0, 10, 'a', 60, 70, 80, 90]

     

    4-4. del로 슬라이스 삭제하기

    • del 시퀀스객체[시작인덱스:끝인덱스]
    >>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> del a[2:5]
    >>> a
    [0, 10, 50, 60, 70, 80, 90]
    
    >>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> del a[2:8:2]
    [0, 10, 30, 50, 70, 80, 90]

     

     

    # 예제 1. 최근 3년간 인구 출력하기 (본문 11.6 연습문제)

    리스트 year에 연도, population에 서울시 인구수가 저장되어 있습니다. 다음 소스 코드를 완성하여 최근 3년간 연도와 인구수가 리스트로 출력되게 만드세요.

    year = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018]
    population = [10249679, 10195318, 10143645, 10103233, 10022181, 9930616, 9857426, 9838892]
    
    print(year[-3:])
    print(population[5:])

     

     

    # 예제 2. 인덱스가 홀수인 요소 출력하기 (본문 11.7 연습문제)

    다음 소스 코드를 완성하여 튜플 n에서 인덱스가 홀수인 요소들이 출력되게 만드세요.

    n = -32, 75, 97, -10, 9, 32, 4, -15, 0, 76, 14, 2
    # 풀이 1.
    print(n[1::2])
    # 풀이 2.
    print(n[1:len(n):2])

     

     

    # 예제 3. 리스트의 마지막 부분 삭제하기 (본문 11.8 심사문제)

    표준 입력으로 숫자 또는 문자열 여러 개가 입력되어 리스트 x에 저장됩니다(입력되는 숫자 또는 문자열의 개수는 정해져 있지 않음). 다음 소스 코드를 완성하여 리스트 x의 마지막 요소 5개를 삭제한 뒤 튜플로 출력되게 만드세요.

    x = input().split()
    del x[-5:]
    print(tuple(x))

     

     

    # 예제 4. 문자열에서 인덱스가 홀수인 문자와 짝수인 문자 연결하기 (본문 11.9 심사문제)

    표준 입력으로 문자열 두 개가 각 줄에 입력됩니다(문자열의 길이는 정해져 있지 않음). 첫 번째 문자열에서 인덱스가 홀수인 문자와 두 번째 문자열에서 인덱스가 짝수인 문자를 연결하여 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다). 연결 순서는 첫 번째 문자열, 두 번째 문자열 순입니다. 그리고 0은 짝수로 처리합니다.

    a = input()[1::2]
    b = input()[::2]
    a + b

     

    댓글

Designed by Tistory.