1) 하나의 데이터 위치 확인 및 추출(indexing)
파이썬 데이터를 구성하고 있는 객체를 찾는 작업은 매우 중요하다. 원하는 값을 찾을 수 있어야 수정 및 보완을 할 수 있기 때문이다. 파이썬에서 객체를 찾는 방법은 자리의 위치를 지정하고 그 위치로 찾아가는 것이다.
데이터의 객체가 있는 위치를 인덱스(index)라고 하고 위치를 찾아가서 값을 추출하는 작업을 인덱싱(indexing)이라고 한다. 파이썬 데이터에서 첫 번째 자리 인덱스 값은 0이고 다음부터 1, 2, 3 등 한자리씩 증가한다. 반대로 가장 마지막 값을 -1로 인덱스하고 역방향으로 -2, -3, 등 -1씩 증가시킨다. 해당 자리를 찾아가기 위해서는 [ ]을 사용하고, 첫 번째 자리를 찾아가고 싶으면 [0]으로 나타낸다. 그럼, 데이터 유형별로 인덱스 값을 알아보도록 하자.
(1) 문자열 인텍스
아래 문자열은 첫 번째 위치에 있는 ‘p’는 0의 자리이고 이를 반환하기 위해서는 words[0]로 나타낸다. 마지막 위치는 인텍스 5 또는 -1로 words[5] 또는 words[-1]를 통해서 반환할 수 있다. 참고로 space도 하나의 자리를 차지한다.
words = 'python'
words[0] # 첫 번째 문자 'p' 반환
words[-1] # 마지막 문자 'n' 반환
문자열 인텍스 확인 메서드
문자열은 인텍스 [ ]를 사용해 찾는 것이 일반적이지만 위치를 모르면 인덱싱([ ])을 할 수가 없다. 그래서 index(), find()를 이용해 해당 문자의 위치를 확인할 수 있다. index()와 find()는 기본적으로 같은 기능을 하지만, index()를 이용해 찾고자 하는 문자가 없으면 에러가 발생해 프로그램이 더 이상 진행되지 않는다. 반면 find()를 사용하면 찾고자 하는 문자가 없더라도 에러를 발생시키지 않고 프로그램을 계속 진행하게 된다.
# index() 메서드를 이용해 위치 확인
python = "Python is interesting" # python 이라는 변수에 문자열 저장
python.index("n") # 첫 번째 'n'을 찾아서 인덱스(위치) 확인: 5
python.index("n", indexing + 1) # 두번째 'n' 문자의 위치를 찾아서 확인: 11
# find() 메서드를 이용해 위치 확인
python.index("html") # 'html'라는 문자열이 없기 때문에 ValueError 발생
python.find("n") # python.index("n")과 같음: 5
python.find("html") # 'html'이라는 문자열이 없음에도 에러를 발생시키지 않고 -1 을 반환해 다음 프로그램을 실행할 수 있도록 해 줌.
(2) 리스트(list)와 튜플(tuple) 자료 인텍싱(indexing)
리스트와 튜플 자료는 순서와 중복을 허용한 객체들의 모임이기 때문에 객체들이 순서(위치)를 가지고 있어서 인덱싱이 가능하다. 인덱싱 방법은 문자열 인덱싱 방법과 같지만, 리스트나 튜플은 하나의 객체가 하나의 위치를 갖는다. 그리고 리스트와 튜플은 그 안에 또 리스트와 튜플을 가질 수 있는데 이럴 때는 2차 리스트를 하나의 위치로 지정한 후 2차 리스트 안에서 0부터 위치를 다시 지정한다.
# 리스트(list) 인텍싱(indexing)
list_1 = [1, 2, 3, ['one', 'two', 'three']]
list_1[2] # 세 번째 위치에 있는 객체: 3
list_1[-1] # 마지막 위치에 있는 객체: ['one', 'two', 'three']
list_1[3][0] # 네 번째 위치 객체 ['one', 'two', 'three']에서 첫 번째 객체 : one
# 튜플(tuple) 인텍싱(indexing)
tuple_1 = (1, 2, 3, ('one', 'two', 'three'))
tuple_1[2] # 세 번째 위치에 있는 객체: 3
tuple_1[-1] # 마지막 위치에 있는 객체: ('one', 'two', 'three')
tuple_1[3][0] # 네 번째 위치 객체 ('one', 'two', 'three')에서 첫 번째 객체 : one
(3) 딕셔너리(dictionary) 자료 인텍싱
집합 자료는 순서와 중복을 허용하지 않는 객체들의 모임으로 순서가 의미가 없기 때문에 인덱싱도 할 수 없다. 하지만 딕셔너리 자료는 key가 존재하기 때문에 [key]를 인덱싱해서 key에 해당하는 value 값을 가져올 수 있다.
lockers = {10:"손흥민", 100:"이강인"} # '손흥민'에게 10번, '이강인'에게 100번 할당
lockers[10] # key 값 10을 이용해 value 값 '손흥민' indexing
lockers[100] # key 값 100을 이용해 value 값 '손흥민' indexing
딕셔너리 자료에서 인덱싱 [ ] 대신에 get() 메서드를 사용할 수 있다. 이는 문자열 인텍스 메서드인 index와 find의 차이와 유사하다. 없는 객체를 인덱싱([ ])으로 찾으면 에러가 발생하지만, get 메서드로 인덱싱하면 객체가 없더라도 에러를 발생시키지 않고 'none'을 반환해 잔여 프로그래밍을 계속 실행하게 도와준다.
lockers[5] # key값 5가 없으므로 KeyError를 발생시켜 프로그래밍 종료
lockers.get(5) # get을 이용하면 key 값이 없으면 NONE을 출력
lockers.get(5, "사용 가능") # key 값이 없으면 '사용 가능'이라는 값을 출력
(4) 인텍싱을 이용해 객체 수정
인덱싱을 이용해 해당 자료를 확인 및 추출하는 과정을 살펴보았다. 인텍싱하는 중요한 이유 중의 하나는 해당 자료를 수정하기 위한 것이다. 수정을 원하는 객체를 인덱싱 한 그 자리에 다른 값으로 바꾸게 된다. 반면에 튜플(tuple) 자료는 기본적으로 수정이 안 되기 때문에 인덱싱만 가능하다. 딕셔너리 자료의 경우에는 key를 인덱싱해서 새로운 값을 넣어주면 된다.
# 리스트 자료 인텍싱 후 수정
list_1 = ['one', 'two', 'three']
list_1[1] = 2 # 두 번째 객체인 'two'를 2로 수정 : ['one', 2, 'three']
# 딕셔너리 자료 인텍싱 후 수정
lockers = {10:"손흥민", 100:"이강인"} # '손흥민'에게 10번, '이강인'에게 100번 할당
lockers[10] = "황희찬" # key 10 자리에 '손흥민'을 '황희찬'으로 바꿈: lockers= {10: '황희찬', 100: '이강인'}
2) 여러 개의 데이터 위치 확인 및 추출(slicing)
슬라이싱(slicing)은 문자열이나 객체들을 여러 개 담고 있는 리스트와 튜플 자료에서 인덱싱(indexing)을 이용해 자리의 범위를 지정하고 해당 객체들을 가져오는 방법이다. 슬라이싱을 지정하는 형식은 [start: end: step]이다. step은 슬라이싱 간격을 의미하며 값을 지정하지 않을 경우 step=1을 자연 할당한다.
여기서 유의해야 할 점은 end 값을 지정하는 것이다. end 값은 위치를 나타내는 인텍스 값이 아니라 시작으로부터 간격이라고 생각해야 한다. 예를 들어 words = ‘python’에서 세 글자 ‘pyt’을 슬라이싱하고자 한다면 start는 인덱스인 0이지만 end 값은 0에서 부터 앞으로 세 칸인 3이 된다. 개념적으로 시작은 인텍스 값으로, 끝은 자리수를 기입한다고 생각하면 편하다.
즉, 처음부터 세 글자를 슬라이싱하려면 words[0: 3]이 된다. 그리고 처음과 끝의 인텍스는 생략하기도 한다. 처음부터 세 번째까지는 [:3], 두 번째부터 마지막까지는 [1:]로 간략하게 표현할 수 있다. 다음의 예를 통해서 한층 자세히 살펴보도록 하자.
문자열 슬라이싱
문자열은 문자 하나와 스페이스 하나가 한 자리를 차지한다. 이를 이용한 인텍싱을 가지고 원하는 문자를 연속해서 가져오게 된다.
id = "901212-1234567"
# 성별 슬라이싱 하기
id[7] # 8번째 자리 값 1이 성별을 나타냄.
# 생년월일 슬라이싱 하기
id[:6] # 첫번째 자리(index=0)부터 여섯 번째 자리(앞으로 6칸)까지 문자열 출력: 901212
# 주민번호 뒤 7자리 슬라이싱 하기
id[7:14] # 8번째 자리(index=7)부터 14번째 자리 까지(앞으로 7칸) : 1234567
pid[7:] # 8번째 자리(index=7)부터 뒤로 모두 : 1234567
id[-7:]) # 8번째 자리(index=-7)부터 뒤로 모두 : 1234567
리스트와 튜플 슬라이싱
리스트와 튜플 자료에 포함된 객체의 위치를 접근하기 위해서는 위치 개념의 숫자인 인덱스를 사용한다. 첫 번재 자료의 인텍스는 0 또는 빈칸, 마지막 자료의 인텍스는 -1 또는 빈칸으로 표현할 수 있다. 이러한 인덱스를 이용해 슬라이싱(특정 부분 객체 가져오기)을 한다. 슬라이싱 방법은 문자열 슬라이싱 방법과 같다.
# 리스트 슬라이싱
list_1 = [1, 2, 3, ['one', 'two', 'three']]
list_1[2:4] # 세 번째부터 네번째까지 : [3, ['one', 'two', 'three']]
list_1[3][2:] # 네 번째(2차 리스트)로 가서 세 번째에서 끝까지: ['three']
list_1[3][:2] # 네 번째(2차 리스트)로 가서 처음부터 두 번째까지: ['one', 'two']
# 튜플 슬라이싱
tuple_1 = (1, 2, 3, ('one', 'two', 'three'))
tuple_1[1:] # 두 번째부터 끝까지: (2, 3, ('one', 'two', 'three'))
tuple_1[2:3] # 세 번째부터 세번째 까지: (3,)
tuple_1[3][2:] # 네 번째(2차 튜플)로 가서 세 번째에서 끝까지: ('three',)
tuple_1[3][:2] # 네 번째(2차 튜플)로 가서 처음부터 두 번째까지: ('one', 'two')
'파이썬' 카테고리의 다른 글
[ 코랩과 파이썬 ] 7. python 반복문 for 문, 한 줄 for 문과 if 문 (0) | 2023.01.12 |
---|---|
[ 코랩과 파이썬 ] 6. python 조건문 if, elif, else, 한 줄 if 문 (0) | 2023.01.12 |
[ 코랩과 파이썬 ] 4. python 자료 연산과 연산자 operators (2) | 2023.01.12 |
[ 코랩과 파이썬 ] 3. python 컨테이너 container 자료: list, tuple, set, dictionary (2) | 2023.01.12 |
[ 코랩과 파이썬 ] 2. python 변수와 스칼라 scalar 자료: 숫자, 문자, 불리언 (2) | 2023.01.12 |