[zero-base/] DS Part 3. 자료구조 - 13일차 스터디 노트

손윤재·2023년 12월 22일

제로베이스 DS 22기

목록 보기
14/55
post-thumbnail

리스트란?

배열과 같이 여러 개의 데이터를 나열한 자료 구조이다.

  • 가변적(Mutable) 자료 구조이다.
    리스트의 크기는 동적으로 조절할 수 있다.
    요소(Item)를 추가하거나 삭제하여 리스트의 길이를 조절한다.

  • 순서가 있는(Ordered) 자료 구조이다.
    리스트의 각 요소는 특정한 위치(Index)를 가지고 그 순서가 유지된다.

  • 인덱스로 요소에 접근할 수 있다.
    각 요소는 고유한 인덱스를 가지고 있어 이를 통해 특정 요소에 접근할 수 있다.
    인덱스는 [0]부터 시작한다.

  • 다양한 자료형(Data Type)을 요소로 가질 수 있다.
    동일한 데이터 타입 뿐만 아니라 서로 다른 데이터 타입의 요소도 포함할 수 있다.

  • [ ](bracket)를 이용해 선언하고, ,로 요소를 구분한다.

     strs = strs = [3.14, '십', 20, 'one', '3.141592', [10, 30], (40, 50, 60)]



< Item 조회 >


✅ 인덱스

인덱스란, 요소(Item)에 자동으로 부여되는 번호표로 리스트의 Item을 조회할 수 있다.

  • index는 ‘0’번부터 시작하며 컴퓨터가 자동으로 부여하는 값이므로 임의로 변경할 수 없다.

  • [ ](으)로 리스트의 요소에 접근할 수 있다.

  • 잘못된 index를 사용할 경우 IndexError: list index out of range가 발생

✅ 반복문

for문의 경우 in keyword를 이용해 index를 사용하지 않고 리스트의 요소를 자동 참조할 수 있다.

➡️ 형식 : for 지역변수 in iterable Object

  cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']

  for car in cars:
      print(car)

  studentCnts = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]

  # 내부 리스트의 아이템을 각 변수에 할당 - iterable 객체를 사용
  for classNo, cnt in studentCnts:
      print('{}학급 학생수: {}'.format(classNo, cnt))    
  • 반복문과 함께 사용해 요소를 조회할 수 있는 방법

    • 내장함수 len() : 리스트의 요소 개수를 정수로 반환

       students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
      
        for i in range(len(students)):
        print('students[{}] : {}'.format(i, students[i]))
      
        n = 0
        while n < len(students):
            print('students[{}] : {}'.format(n, students[n]))
            n += 1
    • 클래스 enumerate를 이용하면 리스트의 Index와 Item을 한번에 조회할 수 있다.

       sports = ['농구', '수구', '축구', '마라톤', '테니스']
      
        for idx, value in enumerate(sports):
            print('{} : {}'.format(idx, value))
          
        # 실행결과
        # 0 : 농구
        # 1 : 수구
        # 2 : 축구
        # 3 : 마라톤
        # 4 : 테니스



< Item 추가 >


append()

append() 메서드는 리스트 끝에 아이템을 추가해 준다.

➡️ 형식 : append(__object)

  students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']

  students.append('강호동')
  print('students : {}'.format(students))
  # students : ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']

  scores = [['국어', 88], ['영어', 91]]
  scores.append(['수학', 96])

  print('scores : {}'.format(scores))
  # scores : [['국어', 88], ['영어', 91], ['수학', 96]]

insert()

insert() 메서드는 특정 위치(인덱스)에 아이템을 추가할 수 있다.

➡️ 형식 : insert(__index, __object)

  students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']

  students.insert(3, '강호동')
  print('students : {}'.format(students))
  # students : ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

  words = ['I', 'a', 'boy.']
  words.insert(1, 'am')

  for word in words:
      print('{} '.format(word), end='')  # I am a boy.



< Item 삭제 >


del

del Keyword로 item을 삭제할 수 있다.

  • index로 한 개씩 삭제

    students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
    
     del students[1]
     print('students: {}'.format(students))
     # students: ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은']
    
     del students[3]
     print('students: {}'.format(students))
     # students: ['홍길동', '박찬호', '이용규', '강호동', '김지은']
  • slice객체로 여러 개 삭제

    students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
     del students[1:4]
     print('students: {}'.format(students))
     # students: ['홍길동', '박승철', '강호동', '김지은']

pop()

pop() 메서드는 Index에 해당하는 Item을 삭제하고 삭제한 Item value를 반환한다.

➡️ 형식 : pop(__index)

  • index의 Default값은 마지막 인덱스이다.
  students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']

  popValue = students.pop()
  print('return value: {}'.format(popValue))
  print('students : {}'.format(students))
  # return value: 강호동
  # students : ['홍길동', '박찬호', '이용규', '박승철', '김지은']
  
  
  students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

  popValue = students.pop(3)
  print('return value: {}'.format(popValue))
  print('students : {}'.format(students))
  # return value: 강호동
  # students : ['홍길동', '박찬호', '이용규', '박승철', '김지은']

remove()

remove() 메서드는 제일 처음 나타나는 특정 요소 한 개를 삭제한다.

➡️ 형식 : remove(__value)

  students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은', '강호동']
  print('students의 길이 : {}'.format(len(students))) #	students의 길이 : 7

  students.remove('강호동')
  print('students : {}'.format(students))
  print('students의 길이 : {}'.format(len(students)))
  #	students : ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
  #	students의 길이 : 6

clear()

리스트의 모든 요소를 삭제한다.

➡️ 형식 : list_obj.remove(__value) (del list_obj[ : ]와 동일)

  students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
  print(students)

  students.clear()
  print(students)

  # 실행결과
  #	['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
  #	[]



< List 확장 >


extend()

extend() 메서드는 리스트에 또 다른 리스트를 연결해 확장한다.

➡️ 형식 : extend(__iterable)

  group1 = ['홍길동', '박찬호', '이용규']
  group2 = ['강호동', '박승철', '김지은']

  group1.extend(group2)
  print('group1: {}'.format(group1))
  print('group2: {}'.format(group2))
  # group1: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
  # group2: ['강호동', '박승철', '김지은']

✅ 연산자

+ 연산자 : 리스트 덧셈 연산은 두 리스트의 연결(결합)이다.

  group1 = ['홍길동', '박찬호', '이용규']
  group2 = ['강호동', '박승철', '김지은']

  result = group1 + group2
  print('group1: {}'.format(group1))
  print('group2: {}'.format(group2))
  print('result: {}'.format(result))
  # group1: ['홍길동', '박찬호', '이용규']
  # group2: ['강호동', '박승철', '김지은']
  # result: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

* 연산자 : 리스트 곱셈 연산은 리스트 객체 반복이다.

  numbers = [2, 50, 0.12, 1, 9]

  numbersMul = numbers * 3
  print('numbersMul: {}'.format(numbersMul))
  # numbersMul: [2, 50, 0.12, 1, 9, 2, 50, 0.12, 1, 9, 2, 50, 0.12, 1, 9]



< List 자르기 >


slice

slice notation: []이나 slice object: slice()는 리스트에서 원하는 범위의 부분을 잘라 새로운 리스트 객체로 반환한다.

  • list_object.[_n : _m]로 슬라이싱, 범위는 (n ≤ items < m)이다.

    numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
    
     print('numbers: {}'.format(numbers[2:4]))
     # numbers: [0.12, 1]
    
     print('numbers: {}'.format(numbers[:4]))
     # numbers: [2, 50, 0.12, 1]
    
     print('numbers: {}'.format(numbers[2:]))
     # numbers: [0.12, 1, 9, 7, 17, 35, 100, 3.14]
    
     print('numbers: {}'.format(numbers[2:-2]))
     # numbers: [0.12, 1, 9, 7, 17, 35]
    
     print('numbers: {}'.format(numbers[-5:-2]))
     # numbers: [7, 17, 35]
     
     print('students: {}'.format(students))
     # numbers: [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
  • slice()로 슬라이싱

    students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
    
     print('students: {}'.format(students[slice(2, 4)]))
     # students: ['이용규', '강호동']
     
     print('students: {}'.format(students[slice(4)]))
     # students: ['홍길동', '박찬호', '이용규', '강호동']
     
     print('students: {}'.format(students[slice(2, len(students))]))
     # students: ['이용규', '강호동', '박승철', '김지은']
     
     print('students: {}'.format(students[slice(2, len(students)-2)]))
     # students: ['이용규', '강호동']
     
     print('students: {}'.format(students[slice(len(students)-5, len(students)-2)]))
    		 # students: ['박찬호', '이용규', '강호동']
     
     print('students: {}'.format(students))
     # students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
  • 슬라이싱을 이용해 아이템을 변경할 수 있다.

    students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
     print('students : {}'.format(students))
     # students : ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
    
     students[1:4] = ['park chanho', 'lee yonggyu', 'gang hodong']
     print('students : {}'.format(students))
     # students : ['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']
    
    students[1:4] = ['박찬호', '이용규']
    print('students : {}'.format(students))
    # students : ['홍길동', '박찬호', '이용규', '박승철', '김지은']
    
    students[1:3] = ['park chanho', 'lee yonggyu', 'gang hodong']
    print('students : {}'.format(students))
    # students : ['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']



< List 정렬 >


sort()

sort() 메서드는 아이템을 정렬한다.

  • Default는 오름차순 정렬이다.
  • reverse 옵션을 True로 설정하면 내림차순 정렬이 수행된다.
  numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]

  numbers.sort()
  print('students: {}'.format(numbers))
  # [0.12, 1, 2, 3.14, 7, 9, 17, 35, 50, 100]

  numbers.sort(reverse=True)
  print('students: {}'.format(numbers))
  # [100, 50, 35, 17, 9, 7, 3.14, 2, 1, 0.12]

reverse()

reverse() 메서드는 아이템 순서를 뒤집어 준다. (정렬 ❌)

  students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

  students.reverse()
  print('students: {}'.format(students))
  # students: ['김지은', '박승철', '강호동', '이용규', '박찬호', '홍길동']


  numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]

  numbers.reverse()
  print('numbers: {}'.format(numbers))
  # numbers: [3.14, 100, 35, 17, 7, 9, 1, 0.12, 50, 2]



< 그 외 Method >


index()

index() 메서드는 인수로 받은 __value에 해당하는 첫 번째 요소의 Index 값을 반환한다. 검색할 범위(__start부터 __stop까지)를 정할 수 있다.

➡️ 형식 : index(__value, __start, __stop)

  students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']

  searchIdx = students.index('강호동')
  print('searchIdx: {}'.format(searchIdx))  # searchIdx: 1

  searchIdx = students.index('강호동', 2, 6)
  print('searchIdx: {}'.format(searchIdx))  # searchIdx: 5

count()

count() 메서드는 특정(__value) 요소의 개수를 정수로 반환한다.

➡️ 형식 : count(__value)

  students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']

  searchCnt = students.count('홍길동')
  print('searchCnt: {}'.format(searchCnt))  # searchCnt: 1

  searchCnt = students.count('강호동')
  print('searchCnt: {}'.format(searchCnt))  # searchCnt: 2

  searchCnt = students.count('김아무개')
  print('searchCnt: {}'.format(searchCnt))  # searchCnt: 0

profile
ISTP(정신승리), To Be Data Scientist

0개의 댓글