3. Data를 묶음으로 다루기
목차
3.1 리스트
- 리스트(List)는 여러 데이터를 1열로 세워 묶은 형태이다.
- 리스트는 시작과 끝은
[ ]기호로 표현하고, 서로 다른 데이터 타입도 묶을 수 있다. (데이터 타입의 종류는 다음 장에서 좀 더 자세히 다룬다.)
list_mixed = [0, 2.5, 'abc']- 리스트는 다음과 같이 여러가지 방법으로 생성할 수 있다.
# 비어있는 리스트 생성
empty_list = []
print(empty_list)[]
# 직접 입력해서 생성
list_manual = [0, 1, 2, 3, 4]
print(list_manual)[0, 1, 2, 3, 4]
# range 함수를 이용한 생성 (이하 A, B, C 모두 정수)
# range(B) - 0부터 1의 간격으로 B보다 작은 정수까지 리스트 생성
list_new = list(range(10))
print(list_new)
# range(A,B) - A부터 시작해 1의 간격으로 B보다 작은 정수까지 리스트 생성
list_new = list(range(1,10))
print(list_new)
# range(A,B,C) - A부터 시작해 C의 간격으로 B보다 작은 정수까지 리스트 생성 (C가 음수일 경우 반대)
list_new = list(range(2,10,2))
print(list_new)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 4, 6, 8]
- 리스트에
+연산과*연산은 조금 특별하게 동작한다.+연산은 좌우의 리스트를 이어 붙인다.*연산은*왼쪽의 리스트를 오른쪽의 숫자만큼 반복해서 붙인다.
# 리스트에서 +연산과 *연산
list_manual = [0, 1, 2, 3, 4]
list_new = list(range(4,-1,-1))
print(list_manual+list_new)
print(list_manual*2)[0, 1, 2, 3, 4, 4, 3, 2, 1, 0] [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
- 리스트는 다음 예시와 같이 기본 제공되는 함수를 이용해 수정할 수 있다.
# list의 맨 뒤에 원소 추가하기
list_manual = [0, 1, 2, 3, 4]
list_manual.append(5)
print(list_manual)[0, 1, 2, 3, 4, 5]
# list의 원하는 위치에 원소 추가하기
# insert(position, value) 참고로 시작위치의 값은 0
list_manual.insert(2, 10)
print(list_manual)[0, 1, 10, 2, 3, 4, 5]
# list의 맨 뒤에 원소 제거하기
list_manual.pop()
print(list_manual)[0, 1, 10, 2, 3, 4]
# list의 원하는 위치에 원소 제거하기
# pop(position)
list_manual.pop(2)
print(list_manual)[0, 1, 2, 3, 4]
- 그외 여러 가지 편리한 함수들이 기본으로 제공된다.
# list의 원소 개수 세기
num_data = len(list_manual)
print(num_data)5
# 원소의 위치 찾기 (처음으로 발견된 원소의 위치 반환)
position = list_manual.index(2)
print(position)2
# list 크기순으로 정렬하기 (기본 오름차순)
list_manual.sort()
print(list_manual)
list_manual.sort(reverse=True)
print(list_manual)[0, 1, 2, 3, 4] [4, 3, 2, 1, 0]
# 원하는 부위 잘라내기 (슬라이싱)
# 하나만 선택해 반환하기
print(list_manual[2])2
# [A:B] A위치부터, B보다 '작은'위치까지 선택
# [2:4] = 2,3의 위치 선택
print(list_manual[2:4])[2, 1]
# [A:] A위치부터, 끝까지
# [:B] 시작부터, B보다 '작은'위치까지 선택
print(list_manual[2:])
print(list_manual[:4])[2, 1, 0] [4, 3, 2, 1]
# [-A] 맨 뒤에서 부터 A번째
print(list_manual[-2])1
3.2 튜플
- 튜플(Tuple)는 List와 같지만 한 번 선언하면, 이후 수정이 불가능한 묶음이다.
- 튜플의 시작과 끝은
( )기호로 표현하고, 나머지는 리스트와 같다.
# 비어있는 튜플 생성 = 하지만 수정이 안되기 때문에 사실상 의미가 없다.
empty_tuple = ()
print(empty_tuple)()
# 직접 입력해서 생성
tuple_manual = (0, 1, 2, 3, 4)
print(tuple_manual)(0, 1, 2, 3, 4)
# range 함수를 이용한 생성 (이하 A, B, C 모두 정수)
print(tuple(range(2,10,2)))(2, 4, 6, 8)
- 수정과 관련된 함수를 제외한, 나머지 제공 함수들은 리스트와 거의 같다.
len(tuple_manual)5
tuple_manual.index(4)4
tuple_manual[1:](1, 2, 3, 4)
3.3 세트
- 세트(Set)도 List와 유사하지만, 원소의 중복을 허용하지 않는다는 점이 다르다.
- 세트의 시작과 끝은
{ }기호로 표현하고, 나머지는 리스트와 같다.
# 비어있는 세트 생성
empty_set = {}
print(empty_set){}
# 직접 입력해서 생성 - 중복원소는 제거된다.
set_manual = {0, 1, 2, 3, 4, 4, 3, 2, 1, 0}
print(set_manual){0, 1, 2, 3, 4}
# range 함수를 이용한 생성 (이하 A, B, C 모두 정수)
print(set(range(2,10,2))){8, 2, 4, 6}
- 세트는 즉 집합이므로, 수학에서의 집합과 관련된 연산 기능도 대부분 제공된다.
- 예를 들어,
# 교집합 '&'
set_first = {1, 3, 5}
set_second = {1, 2, 4, 8}
print(set_first&set_second){1}
# 합집합 '|'
print(set_first|set_second){1, 2, 3, 4, 5, 8}
# 차집합 '-'
print(set_first-set_second){3, 5}
# 부분집합 여부 확인
# A.issuperset(B) - B가 A의 부분집합인지 여부 (A가 B를 포함하는지 여부)
set_third = {1, 3, 5, 7}
set_third.issuperset(set_first)True
# 원소 여부 확인
3 in set_firstTrue
3.4 딕셔너리
- 딕셔너리(Dictionary)는 List와 유사하지만, 위치(index)가 정수가 아닌 ’key’라는 임의의 값으로
- 항목 추가
- 항목 추가
관리된다.
- 딕셔너리의 시작과 끝은
{ }기호로 세트와 표현방법이 같지만, 각 원소가 ’key:value’의 형태로 저장된다.
my_dictionary = {'name':'John', 'age':15, 'height': 1.76}
print(my_dictionary){'name': 'John', 'age': 15, 'height': 1.76}
- 선택 방법 역시 List와 유사하지만 위치(index) 대신 ’key’로 접근한다.
my_dictionary['name']'John'
- 당연히, 딕셔너리가 리스트의 원소가 될 수 있고, 그 반대도 가능하다.
first_user = {'name':'John', 'age':15, 'height':1.76, 'position':[15,3]}
second_user = {'name':'Paul', 'age':17, 'height':1.88, 'position':[-2,7]}
users = [first_user, second_user]
print(users[0]['name'])John