소개
이번 랩에서는 Python 의 자료 구조 (data structure) 에 대해 배우고, 다룰 주요 자료 구조는 리스트 (lists), 튜플 (tuples), 딕셔너리 (dictionaries), 그리고 집합 (sets) 입니다.
학습 목표
- 리스트 (Lists)
- 리스트 컴프리헨션 (List Comprehensions)
- 튜플 (Tuples)
- 딕셔너리 (Dictionaries)
- 집합 (Sets)
이번 랩에서는 Python 의 자료 구조 (data structure) 에 대해 배우고, 다룰 주요 자료 구조는 리스트 (lists), 튜플 (tuples), 딕셔너리 (dictionaries), 그리고 집합 (sets) 입니다.
Python 에서 리스트는 다양한 유형의 객체를 담을 수 있는 다재다능한 컨테이너 역할을 합니다. 여기서는 생성, 값 접근, 값 업데이트, 값 추가, 값 삭제와 같은 기본적인 리스트 연산을 살펴보겠습니다.
리스트는 쉼표로 구분된 값을 대괄호 안에 넣어 정의합니다. 리스트의 데이터 항목은 동일한 유형일 필요가 없습니다.
>>> l1 = [1, 2, 3, 'a', 'hello']
>>> l1
[1, 2, 3, 'a', 'hello']
>>> l2 = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
>>> l2
['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
리스트의 값에 접근하려면 첨자 인덱스 (subscript index) 를 사용합니다.
>>> print("l1[0] = ", l1[0])
l1[0] = 1
다음과 같이 대괄호 형식을 사용하여 문자를 가로챌 수 있으며, 이를 슬라이스 (slice) 라고 합니다. 슬라이스는 리스트에서 항목 범위를 추출하는 방법입니다.
list_name[Start:End:Step]
첫 번째 인덱스 (Start) 는 시작 인덱스이고, 두 번째 인덱스 (End) 는 종료 인덱스입니다. 세 번째 인덱스 (Step) 는 단계 (step) 이며, 여기서 단계는 증가량 (기본값 1) 입니다.
>>> print("l2[1:3] = ", l2[1:3])
l2[1:3] = ['tuesday', 'wednesday']
첨자 인덱스를 사용하여 값에 접근한 다음, 새 값을 할당하여 값을 업데이트할 수 있습니다.
>>> l1[0] = 10
>>> l1
[10, 2, 3, 'a', 'hello']
append() 메서드를 사용하여 리스트에 값을 추가할 수 있습니다.
list_name.append(value)
>>> l1.append('b')
>>> l1
[10, 2, 3, 'a', 'hello', 'b']
>>> l2.append('statuday')
>>> l2
['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'statuday']
del 키워드를 사용하여 리스트에서 값을 삭제할 수 있습니다. 이 메서드는 리스트에서 지정된 인덱스의 요소를 삭제합니다.
del list_name[index]
>>> del l1[0]
>>> l1
[2, 3, 'a', 'hello', 'b']
그리고 remove() 메서드를 사용하여 리스트에서 지정된 값을 삭제할 수도 있습니다.
list_name.remove(value)
>>> l1.remove('a')
>>> l1
[2, 3, 'hello', 'b']
len() 함수를 사용하여 리스트의 길이를 얻을 수 있습니다.
>>> print("Length of l1 = ", len(l1))
Length of l1 = 5
그리고 sorted() 함수를 사용하여 리스트를 정렬할 수 있습니다.
>>> print("Sorted of l2 = ", sorted(l2))
Sorted of l2 = ['friday', 'monday', 'thursday', 'tuesday', 'wednesday']
리스트 컴프리헨션은 기존 반복 가능한 객체 (예: 리스트) 를 반복하고 각 항목에 표현식을 적용하여 새로운 리스트를 생성함으로써 Python 에서 리스트를 생성하는 간결하고 강력한 방법입니다.
리스트 컴프리헨션의 형식은 for 루프로 이해할 수 있습니다. 리스트 컴프리헨션의 구문은 다음과 같습니다.
new_list = [expression for item in old_list]
new_list = [expression for item in old_list if condition]
new_list: old_list 의 각 항목에 대한 표현식에서 생성된 결과 리스트입니다.expression: 새 리스트를 생성하기 위해 old_list 의 각 항목에 적용되는 연산 또는 변환입니다.item: old_list 의 각 항목을 나타내는 변수입니다.old_list: 새 리스트를 생성하는 데 사용되는 기존 리스트입니다.condition(선택 사항): 지정된 기준에 따라 old_list 에서 특정 항목만 포함하도록 적용할 수 있는 필터 조건입니다.Python 셸에서 리스트 컴프리헨션을 연습해 보겠습니다.
>>> ls = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> even_list = [item for item in ls if item % 2 == 0]
>>> even_list
[2, 4, 6, 8, 10]
이 예제에서 even_list 는 ls 리스트에서 짝수만 포함합니다.
리스트 컴프리헨션은 리스트를 조작하는 간결하고 읽기 쉬운 방법을 제공하여 Python 코드를 더 표현력 있고 효율적으로 만듭니다.
튜플은 Python 의 리스트와 유사하지만, 튜플의 요소는 불변 (immutable) 하다는 점이 다릅니다. 즉, 생성 후에는 변경할 수 없습니다. 튜플의 요소는 () 안에 묶여 있고 ,로 구분됩니다.
다음 요소로 튜플을 생성합니다.
>>> tup1 = ('Google', 'Run', 'Python')
>>> tup2 = (1, 2, 3, 4, 5)
>>> empty_tup = ()
>>> tup1
('Google', 'Run', 'Python')
>>> tup2
(1, 2, 3, 4, 5)
>>> empty_tup
()
인덱싱 (indexing) 을 사용하여 튜플의 요소에 접근합니다.
>>> print(tup1[0])
Google
>>> print(tup2[1:3])
(2, 3)
>>> print(empty_tup[0])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range ## Error occurs, because tuple is empty.
튜플은 수정할 수 없지만, 병합할 수 있습니다.
>>> tup3 = tup1 + tup2
>>> print(tup3)
('Google', 'Run', 'Python', 1, 2, 3, 4, 5)
튜플은 수정해서는 안 되는 데이터를 저장하는 신뢰할 수 있는 방법을 제공하여 Python 프로그램에 안정성과 무결성을 제공합니다.
Python 의 딕셔너리는 키 - 값 쌍을 저장하는 다재다능하고 변경 가능한 데이터 구조입니다.
각 키 - 값 쌍은 콜론 (:) 으로 구분되고, 각 쌍은 쉼표 (,) 로 구분되며, 전체 딕셔너리는 중괄호 {}로 묶입니다.
d = {key1 : value1, key2 : value2, key3 : value3 }
딕셔너리의 키는 고유해야 하지만 값은 중복될 수 있습니다.
키 - 값 쌍으로 딕셔너리를 생성합니다.
>>> dict1 = {'name': 'James', "age": 23, "phone": "12345"}
>>> dict2 = {}
>>> dict1
{'name': 'James', 'age': 23, 'phone': '12345'}
>>> dict2
{}
대괄호 [] 안의 키 또는 get() 함수를 사용하여 키 - 값 쌍에 접근합니다.
>>> print(dict1["name"])
James
>>> print(dict2["name"])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
>>> print(dict2.get("name"))
None
dict[key]를 사용하여 딕셔너리에 존재하지 않는 키에 접근하면 KeyError 예외가 발생합니다. 그러나 dict.get(key)는 딕셔너리에서 키를 찾을 수 없는 경우 None을 반환합니다.
키에 값을 할당하여 딕셔너리의 항목을 추가하거나 수정합니다.
>>> dict2["name"] = "Lily"
>>> dict1["name"] = "Bob"
>>> dict2["name"]
'Lily'
>>> dict1["name"]
'Bob'
del dict[key]를 사용하여 키 - 값 쌍을 삭제하거나 dict.clear()를 사용하여 전체 딕셔너리를 지웁니다.
>>> del dict1["name"]
>>> print(dict1)
{'age': 23, 'phone': '12345'}
>>> dict2.clear()
>>> print(dict2)
{}
딕셔너리는 데이터를 저장하고 조작하는 유연한 방법을 제공하여 Python 프로그래밍의 다양한 작업에 필수적입니다.
Python 의 세트는 고유한 요소들의 정렬되지 않은 컬렉션입니다. 중괄호 {} 또는 set() 함수를 사용하여 생성할 수 있습니다.
빈 세트를 생성하려면 {}가 빈 딕셔너리를 생성하는 데 사용되므로 set()을 사용해야 합니다. 다양한 방법으로 세트를 생성합니다.
>>> set1 = set()
>>> print(set1)
set()
>>> set2 = {'apple', 'orange', 'banana'}
>>> print(set2)
{'banana', 'apple', 'orange'}
>>> set3 = set("Hello World!")
>>> print(set3)
{'o', 'H', 'W', ' ', 'd', 'r', '!', 'e', 'l'}
add() 또는 update() 메서드를 사용하여 세트에 요소를 추가합니다.
>>> set1.add('apple')
>>> print(set1)
{'apple'}
>>> set2.update({'orange', 'pear'})
>>> print(set2)
{'apple', 'orange', 'banana', 'pear'}
discard() 또는 remove() 메서드를 사용하여 세트에서 요소를 제거합니다.
discard() 메서드는 요소가 세트에 없는 경우 오류를 발생시키지 않지만, remove() 메서드는 오류를 발생시킵니다.
>>> set1.remove('apple')
>>> print(set1)
set()
>>> set1.discard('banana')
>>> print(set1)
set()
세트는 Python 에서 고유한 요소의 컬렉션으로 작업하는 편리한 방법을 제공하며, 중복 제거 또는 멤버십 테스트와 같은 다양한 작업에 유용합니다.
축하합니다! 데이터 구조 Lab 을 완료했습니다.
이 Lab 에서 Python 의 기본적인 데이터 구조와 문제 해결 시 이러한 데이터 구조를 언제, 어떻게 사용하는지 배웠습니다.