연관 있는 데이터를 컴퓨터로 효율적으로 다루려고 만든 데이터 구조. 파이썬에서는 리스트, 튜플, 딕셔너리, 집합이 여기에 해당하고, 어느 것이든 선언과 입력, 읽기, 추가, 삭제, 수정이라는 같은 질문을 놓고 답이 달라진다.
리스트
여러 가지 관계가 있는 데이터를 하나의 변수로 다루는 방법. [ ] 안에 ,로 데이터를 넣고 각 데이터는 인덱스로 다룬다. mydata = [1, 2, 'hello', 1.2]처럼 타입이 섞여도 된다.
a = list()
b = []
c = [1, 2, 3]
e = [1, 2, ['Python', 'is', 'good']]빈 배열을 만들 때는 []보다 list()를 써주는 편이 낫다. 추가는 append()와 insert(), 삭제는 remove()와 del과 pop(), 수정은 인덱스에 직접 대입하는 방식이다.
튜플
리스트와 매우 유사한데 값의 변경이 불가능하다는 한 가지가 둘을 가른다. 추가도 삭제도 수정도 안 되고 처음 선언한 그대로 써야 한다.
c = (1,) # 값이 하나면 콤마를 넣어야 튜플이다
d = (1, 2, 3)
e = 1, 2, 3 # 괄호 없는 값의 나열도 튜플로 취급한다그러면 가변적인 리스트만 쓰면 되지 않느냐고 물을 수 있다. 리스트는 동적 배열이자 가변 객체라 튜플보다 무겁고 오버헤드가 크다. 상황에 따라 정적 배열이며 불변 객체인 튜플을 쓰는 것이 퍼포먼스를 높이는 데 도움을 준다.
괄호를 생략해도 튜플이라는 성질이 변수 교환을 짧게 만든다. a, b = b, a는 실제로는 (a, b) = (b, a)이고, 튜플 하나가 하나의 변수로 취급되면서 내부 값이 일대일로 대응한다. 함수에서 return a, b라고 쓰면 (a, b)라는 튜플 하나를 반환하는 것도 같은 이유다.
딕셔너리
{키 : 값}의 대응 관계를 가지는 자료형. 연관 배열(Associative array) 또는 해시(Hash)라고도 한다. 리스트나 튜플과 달리 순차적이지 않고 오직 키를 이용해 값을 얻어낸다. 어떤 값을 찾으려고 모든 키를 순차적으로 탐색할 필요 없이 해당하는 키만 찾으면 된다. 해시 테이블 그 자체다.
data_dict = {'한국': 'KR', '일본': 'JP', '중국': 'CN'}
data_dict['미국'] = 'US' # 추가
del data_dict['한국'] # 삭제키가 중복되면 하나를 제외한 나머지 값은 무시된다. 그리고 키에는 변하는 값을 설정할 수 없다. 리스트는 가변 객체라 키가 될 수 없고 튜플은 불변 객체라 키가 된다.
집합
중복을 허용하지 않고 순서가 없는 자료형. 이 특징을 이용해 자료형의 중복을 제거하기 위한 필터 역할로 쓴다. 수백만 건짜리 리스트를 set()으로 바꿨다가 다시 list()로 되돌리면 중복이 사라진다.
순서가 없으니 리스트나 튜플처럼 인덱싱으로 접근할 수 없고, 그 점은 딕셔너리와 같다. 굳이 인덱싱이 필요하면 리스트나 튜플로 변환한다. 빈 집합은 {}가 딕셔너리와 겹치므로 set()으로 만든다.
집합인 만큼 수학의 집합 연산이 그대로 있다. 교집합은 &, 합집합은 |, 차집합은 -, 전체에서 교집합을 뺀 대칭차집합은 ^다.
smartphone = {'삼성', '애플', 'LG', '화웨이'}
television = {'샤오미', '삼성', 'LG', '소니'}
print(smartphone & television) # {'LG', '삼성'}
print(smartphone - television) # {'애플', '화웨이'}자바 컬렉션과 나란히
자바 컬렉션과 나란히 놓으면 같은 개념이 문법만 다르게 나타난다.
| 파이썬 | 자바 | 순서 | 중복 | 변경 |
|---|---|---|---|---|
리스트 [] | List | O | O | O |
튜플 () | 없음 | O | O | X |
딕셔너리 {k:v} | Map | X | 키는 X | O |
집합 set() | Set | X | X | O |
튜플에 정확히 대응하는 자바 자료형은 없다. 굳이 찾자면 불변 컬렉션이 그 자리를 대신한다.