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

HAHAHAEUN·2024년 3월 21일

주요 학습 내용

1. 자료구조란

2. 리스트(List)

1) 리스트 아이템 조회 (index)

2) 리스트 아이템 개수 확인 및 참조(len(), for문, while문)

3) enumerate()

4) 리스트 아이템 변경(추가, 삭제, 연결)

5) 리스트 아이템 정렬(오름차순, 내림차순, 순서 뒤집기)

6) 슬라이싱

7) 그 외 기능들 ('*', index(), count(), del())

I. 자료구조란

  • 자료구조: 여러 개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라고 하고, 이러한 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.
  • 자료구조는 각각의 컨테이너 자료형에 따라 차이가 있으며, Python의 대표적 컨테이너 자료형은 리스트/튜플/딕셔너리/셋트가 있다
  • 네 가지 항목의 주요 차이점은 다음과 같다
    1. 리스트(List): 데이터 변경(수정, 삭제 등) 가능, 중복데이터 허용
    2. 튜플(Tuple): 데이터 수정 불가능
    3. 딕셔너리(Dictionary): key값과 value값으로 이루어져있음, key값 중복 불가능
    4. 셋트(Set): 중복데이터 허용하지 않음, 중복으로 입력 시 값은 하나만 출력 됨

II. 리스트(List):

  • 리스트: 배열과 같이 여러 개의 데이터를 나열한 자료구조
    • '[ ]'를 이용하여 선언하며, ' , '를 통해 구분함
    • 문자/숫자/논리형 등 모든 기본 데이터를 같이 저장할 수 있다
    • 리스트에 또 다른 컨테이너 자료형 데이터를 저장 할 수도 있다

1. 리스트 아이템 조회 (index)

  • 인덱스: 아이템에 자동으로 부여되는 번호표(0부터 시작)
  • 리스트 아이템은 인덱스를 이용하여 조회 가능
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(f'student[0]; {students[0]}')
print(f'student[1]; {students[1]}')
print(f'student[2]; {students[2]}')
print(f'student[3]; {students[3]}')
print(f'student[4]; {students[4]}')

출력 결과 :

2. 리스트 아이템 개수 확인 및 참조(len(), for문, while문)

  • 리스트 길이: 리스트에 저장된 아이템 개수

  • len()과 반복문을 이용하면 리스트의 아이템 조회가 가능하다

  • for문을 이용하면 리스트의 아이템을 자동으로 참조할 수 있다

    (예제 for문 사용)

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

    출력 결과 :

    (예제 while문 사용)

    stuCnt = [[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(stuCnt):
    
       if minCnt == 0 or minCnt > stuCnt[n][1]:
           minClassNo = stuCnt[n][0]
           minCnt = stuCnt[n][1]
    
       if maxCnt < stuCnt[n][1]:
           maxClassNo = stuCnt[n][0]
           maxCnt = stuCnt[n][1]
    
       n += 1  # 무한루프 방지
    
    print(f'학생 수가 가장 적은 학급(학생수): {minClassNo}학급({minCnt})명')
    print(f'학생 수가 가장 많은 학급(학생수): {maxClassNo}학급({maxCnt})명')

    출력 결과 :

3. enumerate()

  • enumerate()함수를 이용하면 아이템을 열거할 수 있다
# 가장 좋아하는 스포츠가 몇 번째에 있는지 출력

sports = ['농구', '수구', '축구', '마라톤', '테니스']
favSport = input('가장 좋아하는 스포츠 입력: ')

bestSportIdx = 0
for idx, value in enumerate(sports):
    if value == favSport:
        bestSportIdx = idx + 1

print(f'{favSport}(은)는 {bestSportIdx}번째에 있습니다.')

출력 결과 :

4. 리스트 아이템 변경(추가, 삭제, 연결)

  • .append(아이템) : 마지막 인덱스에 아이템 추가 가능
# 가족 구성원 추가
myFamilyAge = [['아빠', 40], ['엄마', 38], ['나', 9]]
print(myFamilyAge)
myFamilyAge.append(['동생', 1]) # 리스트 형식으로 추가해야함
print(myFamilyAge)

for member, age in myFamilyAge:
    print(f'{member}의 나이: {age}')

출력 결과 :

  • .insert(인덱스No, 아이템) : 특정 위치에 아이템 추가 가능
# 오름차순 유지하며, 사용자 입력 숫자 추가
# 강의 수강 전 미리 만들어본 프로그램
numbers = [1, 3, 6, 11, 45, 54, 62, 74, 85]
inputNumber = int(input('숫자 입력: '))
insertIdx = 0
for idx, value in enumerate(numbers):
    if inputNumber > value:
        pass
    else:
        insertIdx = idx
        break

numbers.insert(insertIdx, inputNumber)
print(numbers)


# 강의에서 만든 프로그램
for idx, number in enumerate(numbers):
    print(idx, number)

    if insertIdx == 0 and inputNumber < number:
        insertIdx = idx
numbers.insert(insertIdx, inputNumber)
print(numbers)

출력 결과 :

  • .pop() : 마지막 인덱스에 해당하는 아이템 삭제 가능

  • .pop(n) : n번 인덱스에 해당하는 아이템 삭제 가능

    위에 insert 와 같은 예제에서 아래 코드를 추가하면 결과는 다음과 같다

    numbers.pop()
    print(numbers)
    
    numbers.pop(2)
    print(numbers)

    출력 결과 :

  • .remove(아이템) : 특정 아이템 삭제 가능

    • 단, remove()는 한 개의 아이템만 삭제 가능하므로, 삭제하려는 데이터가 2개 이상이라면 while문 사용 해야함

      students = ['홍길동', '박찬호', 
                  '이용규', '강호동', 
                  '박승철', '김지은', 
                  '강호동']
      print(students)
      while '강호동' in students: # 강호동이 있으면 True, 없으면 False
          students.remove('강호동')
      print(students)
      print('강호동' in students)

      출력 결과 :

  • .extend(): 연결/확장

    • listA.extend(listB) = > listA가 확장 됨
  • ' + ' : 리스트 더하기

    • listA + listB => 다시 listA에 할당 해주지 않는 이상, 기존 list들은 남아있고, 새로운 listC(listA + listB)가 생성됨
group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']
group1.extend(group2)
print(f'group1: {group1}')
print(f'group2: {group2}')

(group1이 확장된 것을 볼 수 있다)

group3 = group1 + group2
print(f'group1: {group1}')
print(f'group2: {group2}')

(group1의 아이템이 변동이 없는 것을 확인할 수 있다)

5. 리스트 아이템 정렬(오름차순, 내림차순, 순서 뒤집기)

  • .sort(): 오름차순 정렬
  • .sort(reverse = True): 내림차순 정렬
  • .reverse(): 아이템 순서 뒤집기
scores = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playerScore: {}'.format(scores))
scores.sort()
print('playerScore(오름차순): {}'.format(scores))
scores.sort(reverse=True)
print('playerScore(내림차순): {}'.format(scores))
scores.reverse()
print('playerScore(순서 뒤집기): {}'.format(scores))

출력 결과 :

6. 슬라이싱

  • [n:m:a]를 이용하면 리스트에서 원하는 아이템만 뽑아낼 수 있다
    • n: 시작점
    • m: 종료지점
    • a: 단계
  • [n:m] = [아이템]을 통해 아이템 변경 가능
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers[2:4])) 
# 인덱스2번째 부터 3번째 까지
print('numbers: {}'.format(numbers[:4]))  
# 0부터 3까지
print('numbers: {}'.format(numbers[2:]))  
# 인덱스 2부터 끝까지
print('numbers: {}'.format(numbers[2:-2]))  
# 2부터 ~ 뒤에서 2번째 다음 까지
print('numbers: {}'.format(numbers[-5:-2]))  
# 뒤에서 5번째부터 ~ 뒤에서 2번째 다음 까지

출력 결과 :
위 결과에서 아래 항목을 추가하면

numbers[0:1] = ['two']
print('numbers: {}'.format(numbers))

(2가 'two'로 바뀐걸 확인할 수 있다)

7. 그 외 기능들 ('*', index(), count(), del())

  • 리스트의 곱셈(*): 리스트를 곱한 수만큼 출력한다
students = ['홍길동']
print('students: {}'.format(students))
studentsMul = students * 3
print('studentsMul: {}'.format(studentsMul))

출력 결과 :

  • 특정 아이템의 index 찾기(.index())
students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print(f'students: {students}')

searchIdx = students.index('강호동')
print('students.index(\'강호동\'): {}'.format(searchIdx))
# 중복값 있을 시, 가장 먼저 나오는 값의 인덱스 출력됨
searchIdx = students.index('강호동', 2,6)
print('students.index(\'강호동\'): {}'.format(searchIdx))
# 범위 지정 해줄 수 있음

출력 결과 :

  • 특정 아이템의 개수 알아내기(.count())
  • 필요 없는 아이템 삭제하기(del())
students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print('students: {}'.format(students))

searchCnt = students.count('강호동')
print('개수: {}'.format(searchCnt))
searchCnt = students.count('강')
print('개수: {}'.format(searchCnt))
print('='*50)

# 하나씩 삭제
del(students[1])
print('students: {}'.format(students))

출력 결과 :

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

profile
할 거면 제대로 하자

0개의 댓글