시퀀스 자료형(sequence types)이란 값이 연속적으로 이어진 자료형이다. 즉, 데이터에 순서(번호)를 붙여 나열한 것이다.
리스트, 튜플, range, 문자열을 주로 사용하며, bytes, bytearray라는 자료형도 있다.
데이터를 순서대로 하나씩 나열하여 나타낸 데이터 구조이므로 특정 위치(~번째)의 데이터를 가리킬 수 있다.
시퀀스 자료형으로 만든 객체를 시퀀스 객체라고 하며, 시퀀스 객체에 들어잇는 각 값을 요소(element)라고 부른다.
시퀀스에 어떤 요소가 들어 있는지 확인하고 싶을 때는 in 연산자를 사용한다. 반대로 요소가 없음을 검사하려면 not in을 사용한다.
값 in 시퀀스객체
값 not in 시퀀스객체
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> 30 in a
True
>>> 100 not in a
True
시퀀스 객체는 +
연산자와 *
연산자를 사용하여 객체를 서로 연결하거나 반복할 수 있다.
>>> a = [0, 10, 20, 30]
>>> b = [9, 8, 7, 6]
>>> a + b
[0, 10, 20, 30, 9, 8, 7, 6]
[0, 10, 20, 30] * 3
[0, 10, 20, 30, 0, 10, 20, 30, 0, 10, 20, 30]
단, range는 +
연산자와 *
연산자로 객체를 연결하거나 반복할 수 없다. 이때는 range를 리스트 또는 튜플로 만든다.
>>> list(range(0, 10)) + list(range(10, 20))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
len(시퀀스객체)
시퀀스 객체의 각 요소는 순서가 정해져 있으며, 이 순서를 인덱스라고 부른다.
인덱싱(indexing)을 통해 시퀀스 객체의 요소를 가리켜서 그 요소를 구하거나 다른 값으로 수정하는 등의 작업을 할 수 있다.
시퀀스객체[인덱스]
파이썬에서는 첫 번째 요소를 0번으로 하여 순서대로 번호를 매긴다. 0번 위치가 첫 번째 요소의 위치이고, 1번 위치는 두번째 요소의 위치다. 또한, -1번 위치란 뒤에서부터 첫 번째 위치, 즉 마지막 위치를 뜻한다.
>>> a = [a, b, c, d, e, f, g, h]
>>> a[1] # 1번 위치(두 번째)의 요소 가리키기
'b'
>>> a[-1] # -1번 위치(뒤에서 첫 번째)의 요소 가리키기
'h'
범위를 벗어난 인덱스를 지정하면 IndexError가 발생한다.
인덱싱 연산은 단 하나의 요소만을 가리키지만, 슬라이싱(slicing) 연산을 이용하면 일정한 범위의 요소를 선택할 수 있다. 슬라이싱 연산으로 선택할 범위를 지정할 때는 대괄호 속에 속에 콜론(:) 연산자로 시작 위치와 종료 위치를 구분해 표기한다. 이 때, 시작 위치는 범위에 포함되지만 종료 위치는 포함되지 않는다. (시작 위치 <= 범위 < 종료 위치)
시작 위치를 생략하면 처음부터, 종료 위치를 생략하면 마지막까지를 의미한다. 둘다 생략하면 시퀀스의 전체 범위가 선택된다.
>>> a[2:6] # 2 이상 6 미만 위치의 범위 선택
['c', 'd', 'e', 'f']
>>> a[:3] # 3 미만 위치의 범위 선택 (시작 위치 생략)
['a', 'b', 'c']
>>> a[5:] # 5 이상 위치의 범위 선택 (종료 위치 생략)
['f', 'g', 'h']
>>> a[:] # 전체 범위 선택 (시작, 종료 위치 모두 생략)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
대괄호 안에 세 번째 값으로 간격(step)을 지정할 수 있다.
>>> a[::2] # 전체 범위에서 두 요소마다 하나씩 선택
['a', 'c', 'e', 'g']
>>> a[1::2] # 1 이상의 범위에서 두 요소마다 하나씩 선택
['b', 'd', 'f', 'h']
>>> a[::-1] # 전체 범위에서 뒤에서부터 한 요소마다 하나씩 선택
['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
슬라이싱 표현으로 선택한 범위에 새로운 값을 대입하면 그 범위의 요소들을 다른 내용으로 교체할 수 있다. 이 경우에는 복제본이 생성되는 것이 아니라 원본 시퀀스가 수정된다. 선택한 범위의 크기와 새로운 내용의 크기는 달라도 된다.
>>> number_list[1:3] = [200, 300] # 1 - 3 위치를 선택해 새로운 내용으로 수정
>>> number_list
[1, 200, 300, 4, 5]
슬라이싱을 통한 시퀀스 복제와 단순 대입의 비교
슬라이싱 연산으로 구한 시퀀스는 원본 시퀀스의 일부가 아니라 독립적인 사본이다.
>> original_list = ['a', 'b', 'c', 'd'] >> copied_list = original_list[:] # 리스트 복제하기 >> copied_list == original_list # 두 리스트의 내용은 동일하다 True >> copied_list[0] = 'A' # 사본의 요소 하나를 변경하면... >> copied_list # 사본의 내용은 수정되었다 ['A', 'b', 'c', 'd'] >> original_list # 그러나 원본의 내용은 수정되지 않았다 ['a', 'b', 'c', 'd'] >> copied_list == original_list # 이제 두 리스트의 내용이 다르다 False
반면, 시퀀스를 다른 변수에 단순히 대입할 경우에는 이름만 두 개일 뿐, 두 이름이 가리키는 시퀀스는 동일하다.
>> assigned_list = original_list # 리스트를 다른 변수에 대입 >> assigned_list[1] = 'B' # 대입한 리스트를 수정 >> original_list # 원본 리스트의 내용이 변경되었다 ['a', 'B', 'c', 'd']
시퀀스객체[인덱스] = 값
시퀀스 객체는 [ ]로 요소에 접근한 뒤 =로 값을 할당한다.
단, 튜플, range, 문자열은 저장된 요소를 변경할 수 없다. 불변객체, 읽기 전용
del 시퀀스객체[인덱스]
단, 튜플, range, 문자열은 저장된 요소를 삭제할 수 없다.
아래의 메서드는 시퀀스의 내용을 수정하는 메서드이기 때문에 불변객체인 튜플, range, 문자열에는 적용할 수 없다.
append(x)
: 리스트의 맨 마지막에 x를 추가
insert(a, b)
: a번째 위치에 b를 삽입
extend(seq)
: 원래의 리스트에 리스트를 더함
pop()
: 리스트의 맨 마지막 요소를 돌려주고 그 요소를 삭제
remove(x)
: 첫 번째로 나오는 x를 삭제
clear()
: 모든 요소를 제거
sum(a)
: 모든 요소의 합
min(a)
: 가장 작은 요소
max(a)
: 가장 큰 요소, 크기를 서로 비교할 수 없을 때는 오류가 발생
본 포스팅은 아래의 사이트를 참고하여 작성되었습니다.
연오의 파이썬 https://python.bakyeono.net/chapter-6.html
코딩도장 https://dojang.io/