Python 데이터 구조 기본

PythonBeginner
지금 연습하기

소개

이번 랩에서는 Python 의 자료 구조 (data structure) 에 대해 배우고, 다룰 주요 자료 구조는 리스트 (lists), 튜플 (tuples), 딕셔너리 (dictionaries), 그리고 집합 (sets) 입니다.

학습 목표

  • 리스트 (Lists)
  • 리스트 컴프리헨션 (List Comprehensions)
  • 튜플 (Tuples)
  • 딕셔너리 (Dictionaries)
  • 집합 (Sets)
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 67%입니다.학습자들로부터 94%의 긍정적인 리뷰율을 받았습니다.

리스트 (Lists)

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']

리스트 컴프리헨션 (List Comprehensions)

리스트 컴프리헨션은 기존 반복 가능한 객체 (예: 리스트) 를 반복하고 각 항목에 표현식을 적용하여 새로운 리스트를 생성함으로써 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 코드를 더 표현력 있고 효율적으로 만듭니다.

튜플 (Tuples)

튜플은 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 프로그램에 안정성과 무결성을 제공합니다.

딕셔너리 (Dictionaries)

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 프로그래밍의 다양한 작업에 필수적입니다.

세트 (Sets)

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 의 기본적인 데이터 구조와 문제 해결 시 이러한 데이터 구조를 언제, 어떻게 사용하는지 배웠습니다.