[Zero-Base DS]스터디노트_자료구조(02)

HAHAHAEUN·2024년 3월 23일

주요 학습내용

튜플(Tuple)

1) 아이템 조회(index) 및 개수 확인(len())

2) 아이템 존재 유/무 판단하기(in/not in)

3) 튜플 아이템 참조(for문, while문)

4) 튜플 결합 ( + )

5) 원하는 아이템 뽑아내기(슬라이싱)

6) 튜플 정렬(sort() / sort(reverser = True) / sorted())

7) 튜플 vs 리스트

I. 튜플(Tuple)

  • 튜플(Tuple): 리스트(List)와 비슷하지만 아이템 변경이 불가
  • '( )'를 이용해서 선언하고, ' , '를 이용하여 데이터를 구분한다
  • 튜플 안에 또 다른 컨테이너 자료형 데이터를 저장할 수 있으며, 해당 컨테이너 자료형이 수정가능한 자료형일 경우, 수정 가능

1. 아이템 조회(index) 및 개수 확인(len())

  • 튜플은 리스트와 마찬가지로 아이템에 부여되는 번호표 있음(0부터 시작)
  • 튜플 아이템은 인덱스를 이용하여 조회 가능
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')

for i in range(0, len(students)):
    print(f'students[{i}]: {students[i]}')

numbers = (10, 20, 30, 40, 50)

for i in range(0, len(numbers)):
    print('numbers[{}]: {}'.format(i, numbers[i]))

출력 결과 :

  • 튜플은 리스트와 마찬가지로 저장된 아이템 개수를 튜플 길이라고 한다(1부터 시작)

2. 아이템 존재 유/무 판단하기(in/not in)

  • in/not in 을 이용하여 아이템의 존재 유/무를 판단할 수 있다
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')

searchName = input('학생 이름 입력: ')

if searchName in students:
    print('{} 학생은 우리반 학생입니다.'.format(searchName))
if searchName not in students:
# 그냥 else: 도 사용 가능
    print('{} 학생은 우리반 학생이 아닙니다.'.format(searchName))
# in/not in 키워드는 문자열에서도 사용 가능

출력 결과 :

3. 튜플 아이템 참조(for문, while문)

  1. For문 사용

    예제(for문) :

    classInfo = (
        (1, 18),
        (2, 19),
        (3, 23),
        (4, 21),
        (5, 20),
        (6, 22),
        (7, 17),)
    
    minClassNo = 0; maxClassNo = 0
    minCnt = 0; maxCnt = 0
    
    for classNo, cnt in classInfo:
        if minCnt == 0 or minCnt > cnt:
            minCnt = cnt
            minClassNo = classNo
        if maxCnt == 0 or maxCnt < cnt:
            maxCnt = cnt
            maxClassNo = classNo
    
    print(f'학생 수가 가장 적은 학급(학생수): {minClassNo}학급({minCnt}명)')
    print(f'학생 수가 가장 적은 학급(학생수): {maxClassNo}학급({maxCnt}명)')

    출력 결과 :

  1. While문 사용

    예제(while문) :

    classInfo = (
        (1, 18),
        (2, 19),
        (3, 23),
        (4, 21),
        (5, 20),
        (6, 22),
        (7, 17),)
    
    minClassNo = 0; maxClassNo = 0
    minCnt = 0; maxCnt = 0
    
    n = 0
    while n < len(classInfo):
        if minCnt == 0 or minCnt > classInfo[n][1]:
            minCnt = classInfo[n][1]
            minClassNo = classInfo[n][0]
        if maxCnt == 0 or maxCnt < classInfo[n][1]:
            maxCnt = classInfo[n][1]
            maxClassNo = classInfo[n][0]
    
        n += 1
    
    print(f'학생수가 가장 적은 학급(학생수): {minClassNo}학급({minCnt}명)')
    print(f'학생수가 가장 많은 학급(학생수): {maxClassNo}학급({maxCnt}명)')

    출력 결과 :

4. 튜플 결합 ( + )

  • ( + )를 이용하여 튜플끼리 결합할 수 있다

    tuple3 = tuple1 + tuple2
    (새로운 tuple생성)

  • 하지만, 튜플은 기존 자료를 변경할 수 없기에, .extend()는 사용할 수 없다
students1 = ('홍길동', '박찬호', '이용규')
students2 = ('박승철', '김지은', '강호동')
print('student1: {}'.format(students1))
print('student2: {}'.format(students2))
print('-'*50)
students3 = students1 + students2
print('student1: {}'.format(students1))
print('student2: {}'.format(students2))
print('student3: {}'.format(students3))

출력 결과 : (기존 student1과 student2에는 변동X, students3 생성됨)

  • 만약 .extend() 사용한 경우, 아래와 같은 오류 안내 메세지를 확인할 수 있다
students1.extend(students2)

출력 결과 :

5. 원하는 아이템 뽑아내기(슬라이싱)

  • 리스트와 마찬가지로[n:m:a] / slice()를 이용하면 원하는 아이템만 뽑아낼 수 있다
# 슬라이싱 할 때 단계 설정 가능[a:b:단계(n)]
numbers = (2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14)
print('numbers: {}'.format(numbers))
print('numbers[2:-2]: {}'.format(numbers[2:-2]))
print('numbers[2:-2]: {}'.format(numbers[2:-2:2]))
print('numbers[2:-2]: {}'.format(numbers[:-2:2]))
print('numbers[2:-2]: {}'.format(numbers[::2]))

출력 결과 :

  • 튜플은 기본적으로 아이템 변경이 불가능하기 때문에, 슬라이싱을 통한 아이템 변경을 하기 위해서는 우선적으로 리스트로 자료구조를 변경해주어야 한다

    • 리스트로 변경 안했을 경우,

    • 리스트로 변경 한 경우,

      numbers = list(numbers)
      numbers[0:1] = ['two']
      print('numbers: {}'.format(numbers))
      print('-'*50)```

    • 단, 리스트에 튜플 아이템으로는 변경 가능
      (전체 자료구조는 리스트이기 때문에)

      
      studentsList = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
      print(f'studentsLists: {studentsList}')
      
      studentsList[1:4] = ('park chanho', 'lee younggyu', 'kang hodong')
      print(f'studentsLists: {studentsList}')
      print(f'studentsLists: {type(studentsList)}')
      print('-'*50)

      출력 결과 :

6. 튜플 정렬(sort() / sort(reverser = True) / sorted())

  • 기본적으로 튜플은 수정이 불가하기 때문에, 정렬하고자 하는 경우, 리스트로 변경 후 정렬
# 1) list 변환 후 정렬
students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
print(type(students))
print((students))

students = list(students)
print(type(students))
students.sort()
print(students)

students = tuple(students)
print(type(students))
print(students)
print('='*50)

출력 결과 :

  • sorted()를 이용하면, 리스트로 변경하지 않고도 정렬 가능

    sorted()는 리스트 자료형을 반환한다

     
    students1 = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
    print(students1)
    print(type(students1))
     
    sorted(students1)
    print(sorted(students1))
    print(type(sorted(students1)))

    출력 결과 :

7. 튜플 vs 리스트

구분 리스트(List) 튜플(Tuple)
아이템 추가/변경/삭제 O X
아이템 결합 O O
선언시 괄호 삭제 X O
자료형 변환 O O

[자료 출처: 제로베이스 데이터 취업 스쿨]

profile
할 거면 제대로 하자

0개의 댓글