Created at : 2024-09-02 11:29
Auther: Soo.Y

3. 데이터 구조 (Data Structures)

데이터 구조는 데이터를 조직화하고 저장하는 방식으로, 효율적인 데이터 처리를 가능하게 합니다. 파이썬에서는 다양한 기본 데이터 구조를 제공하며, 이를 통해 데이터를 효과적으로 관리할 수 있습니다. 이 섹션에서는 리스트, 튜플, 집합, 딕셔너리와 같은 기본적인 데이터 구조를 다룹니다.

3.1 리스트 (List)

리스트는 파이썬에서 가장 자주 사용되는 데이터 구조 중 하나로, 여러 개의 항목을 순서대로 저장할 수 있는 가변 길이 시퀀스입니다. 리스트는 대괄호 []로 정의하며, 다양한 데이터 타입을 포함할 수 있습니다.

  • 리스트 생성:
fruits = ["사과", "바나나", "체리"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "안녕하세요", 3.14, True]
  • 리스트 요소 접근:
print(fruits[0])  # 첫 번째 요소: 사과
print(fruits[-1])  # 마지막 요소: 체리
  • 리스트 슬라이싱:
print(numbers[1:4])  # 인덱스 1부터 3까지: [2, 3, 4]
print(numbers[:2])  # 처음부터 인덱스 1까지: [1, 2]
print(numbers[2:])  # 인덱스 2부터 끝까지: [3, 4, 5]
  • 리스트 수정:
fruits[1] = "블루베리"
print(fruits)  # 출력: ["사과", "블루베리", "체리"]
  • 리스트에 요소 추가:
fruits.append("오렌지")  # 리스트 끝에 요소 추가
print(fruits)  # 출력: ["사과", "블루베리", "체리", "오렌지"]
 
fruits.insert(1, "바나나")  # 인덱스 1에 요소 삽입
print(fruits)  # 출력: ["사과", "바나나", "블루베리", "체리", "오렌지"]
  • 리스트에서 요소 제거:
fruits.remove("체리")  # 특정 요소 제거
print(fruits)  # 출력: ["사과", "바나나", "블루베리", "오렌지"]
 
fruits.pop()  # 마지막 요소 제거
print(fruits) # 출력: ["사과", "바나나", "블루베리"]
 
fruits.pop(2)  # 인덱스 2의 요소 제거
print(fruits)  # 출력: ["사과", "바나나", "오렌지"]
  • 리스트 결합과 반복:

    fruits += ["포도", "수박"]  # 리스트 결합
    print(fruits)  # 출력: ["사과", "바나나", "오렌지", "포도", "수박"]
     
    repeated_list = [1, 2, 3] * 2  # 리스트 반복
    print(repeated_list)  # 출력: [1, 2, 3, 1, 2, 3]
  • 리스트 정렬:

    numbers = [5, 2, 9, 1, 5, 6]
    numbers.sort()  # 오름차순 정렬
    print(numbers)  # 출력: [1, 2, 5, 5, 6, 9]
     
    numbers.sort(reverse=True)  # 내림차순 정렬
    print(numbers)  # 출력: [9, 6, 5, 5, 2, 1]

3.2 튜플 (Tuple)

튜플은 리스트와 유사하지만, 수정할 수 없는(immutable) 데이터 구조입니다. 튜플은 소괄호 ()로 정의하며, 데이터가 변경되지 않아야 하는 경우에 유용합니다.

  • 튜플 생성:

    fruits = ("사과", "바나나", "체리")
    numbers = (1, 2, 3, 4, 5)
    mixed = (1, "안녕하세요", 3.14, True)
  • 튜플 요소 접근:

    print(fruits[0])  # 첫 번째 요소: 사과
    print(fruits[-1])  # 마지막 요소: 체리
  • 튜플에서 요소 변경 불가: 튜플은 불변(immutable)이므로, 생성된 후에는 요소를 변경할 수 없습니다. 요소를 추가하거나 삭제하려고 하면 오류가 발생합니다.

    # fruits[0] = "포도"  # 오류 발생: 튜플은 수정 불가
  • 튜플과 리스트 변환: 튜플과 리스트는 서로 변환할 수 있습니다.

    fruits_list = list(fruits)  # 튜플을 리스트로 변환
    fruits_list.append("오렌지")
    fruits_tuple = tuple(fruits_list)  # 리스트를 다시 튜플로 변환
    print(fruits_tuple)  # 출력: ("사과", "바나나", "체리", "오렌지")
  • 튜플 언패킹: 튜플의 요소를 변수로 쉽게 할당할 수 있습니다.

    a, b, c = fruits
    print(a, b, c)  # 출력: 사과 바나나 체리

3.3 집합 (Set)

집합은 중복되지 않은 요소들의 모임을 나타내며, 순서가 없는 데이터 구조입니다. 집합은 중괄호 {}로 정의하며, 수학적 집합 연산(교집합, 합집합, 차집합 등)을 수행할 수 있습니다.

  • 집합 생성:

    fruits = {"사과", "바나나", "체리"}
    numbers = {1, 2, 3, 4, 5}
  • 집합의 특징:

    • 집합은 중복된 요소를 허용하지 않습니다.
    • 순서가 없기 때문에 인덱싱이 불가능합니다.
    unique_numbers = {1, 2, 2, 3, 4, 4, 5}
    print(unique_numbers)  # 출력: {1, 2, 3, 4, 5}
  • 집합에 요소 추가 및 제거:

    fruits.add("오렌지")  # 요소 추가
    print(fruits)  # 출력: {"사과", "바나나", "체리", "오렌지"}
     
    fruits.remove("바나나")  # 특정 요소 제거
    print(fruits)  # 출력: {"사과", "체리", "오렌지"}
  • 집합 연산:

    set_a = {1, 2, 3}
    set_b = {3, 4, 5}
     
    print(set_a | set_b)  # 합집합: {1, 2, 3, 4, 5}
    print(set_a & set_b)  # 교집합: {3}
    print(set_a - set_b)  # 차집합: {1, 2}
    print(set_a ^ set_b)  # 대칭 차집합: {1, 2, 4, 5}

3.4 딕셔너리 (Dictionary)

딕셔너리는 키-값 쌍을 저장하는 데이터 구조로, 해시맵이나 연관 배열과 유사합니다. 딕셔너리는 중괄호 {}로 정의하며, 키를 통해 값을 빠르게 접근할 수 있습니다.

  • 딕셔너리 생성:

    student = {
        "이름": "홍길동",
        "나이": 20,
        "전공": "컴퓨터 공학"
    }
  • 딕셔너리 요소 접근:

    print(student["이름"])  # 출력: 홍길동
    print(student.get("전공"))  # 출력: 컴퓨터 공학
  • 딕셔너리 요소 추가 및 수정:

    student["학년"] = 2  # 요소 추가
    print(student)  # 출력: {"이름": "홍길동", "나이": 20, "전공": "컴퓨터 공학", "학년": 2}
     
    student["전공"] = "전자 공학"  # 요소 수정
    print(student)  # 출력: {"이름": "홍길동", "나이": 20, "전공": "전자 공학", "학년": 2}
  • 딕셔너리에서 요소 제거:

     

del student[“학년”] # 특정 키-값 쌍 제거 print(student) # 출력: {“이름”: “홍길동”, “나이”: 20, “전공”: “전자 공학”}

student.pop(“전공”) # pop()으로 요소 제거 print(student) # 출력: {“이름”: “홍길동”, “나이”: 20}


- **딕셔너리 순회**:
딕셔너리는 키와 값에 대해 반복문을 사용할 수 있습니다.

```python
for key, value in student.items():
    print(f"{key}: {value}")
  • 딕셔너리의 키, 값, 아이템:
    print(student.keys())  # 출력: dict_keys(['이름', '나이'])
    print(student.values())  # 출력: dict_values([홍길동, 20])
    print(student.items())  # 출력: dict_items([('이름', '홍길동'), ('나이', 20)])

3.5 데이터 구조의 활용

파이썬의 데이터 구조를 적절히 활용하면, 데이터를 보다 효율적으로 관리하고 처리할 수 있습니다. 상황에 맞는 데이터 구조를 선택하여 코드의 가독성을 높이고 성능을 향상시킬 수 있습니다.

  • 리스트는 순서가 중요하고, 데이터의 추가와 삭제가 빈번한 경우에 적합합니다.
  • 튜플은 데이터의 불변성을 보장해야 할 때 사용합니다.
  • 집합은 중복을 허용하지 않으며, 수학적 집합 연산을 수행할 때 유용합니다.
  • 딕셔너리는 키를 통해 데이터를 빠르게 조회해야 할 때 가장 효과적입니다.

이제 파이썬의 기본적인 데이터 구조에 대해 이해하게 되었습니다. 이들 구조를 활용하여 다양한 문제를 해결할 수 있습니다.

관련 문서

1. 파이썬(Python) 이란