자료구조_List의 모든 것

jaam._.mini·2023년 11월 16일
0

📒Python 기초 수학

목록 보기
35/46

오늘은 !! 앞으로 여러 문제들을 풀어나가며,
LIST에 관해 궁금한 사항이 생기면 이 자료만으로도 참고할 수 있게 정리해보고자 한다.

앞선 강의들을 수강하며 궁금했던 부분들도 이번 정리를 통해 해결할 수 있었다!


📖리스트; List 란?

배열과 흡사한 구조
여러개의 데이터를 나열한 자료 구조

🏷️리스트 선언

students = ['홍길동', '박찬호', '이용규', '박승철']
  • []를 이용해 선언하고 데이터 구분은 , 를 이용

  • '홍길동'은 아이템(요소)라고 한다.

  • 숫자, 문자, 논리형 등 모든 기본 데이터를 같이 저장할 수 있다.
    strs = [3.14, '십', 'one', '3.14']

  • 리스트에 또 다른 컨테이너 자료형 데이터를 저장할 수 있다.


📖아이템 조회

인덱스란 아이템에 자동으로 부여되는 번호표 이다.

  • '홍길동'선언 = 리스트에 넣었다
  • 넣은 뒤 컨퓨터 프로그램에서 자동 번호표를 부여 한다.
  • 부여된 번호를 인덱스(index)라고 한다.
  • 인덱스(index)는 무.조.건 0부터 시작한다. (변경 불가능)

✔️ 번호를 통해 리스트에 접근!!이 가능

🏷️방법

🏷️실습


📖아이템 수 조회

🏷️len()을 이용한 조회

리스트의 길이 = 아이템의 수

🏷️실습_1

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

🏷️실습_2


📖for()

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

(1) index 이용
for i in range(len(cars)):
cars의 길이(len) 만큼
print(cars[i])
cars의 i 인덱스를 찾아가 출력해줘

(2) 이터러블(iterable)^ 객체 이용 ⭐
for car in cars:
print(car)

  • ^이터러블(iterable)

    이터러블이란 말 그대로 반복할 수 있는 객체들을 말한다.이터러블에는 리스트, 문자열, 딕셔너리, 튜플 등이 있으며 모두 요소들에 반복하여 접근 가능하다는 특징이 있다.

🏷️내부 리스트 조회

for classNo, cnt in studentCnts:

  • studentCnts 이터러블 객체에!

  • classNo, cnt 변수를 2개 주는 것 ⭐

  • 리스트 안에 리스트가 중첩되어 있을 때, classNo, cnt는 각각 119를 가리킴 (자동으로 변수를 찾아감)
    → (출력) 1학급 학생수: 19

🏷️실습

studentCnts = [[1,18],[2,19],[3,23],[4,21],[5,20],[6,22],[7,17]]

sum = 0
avg = 0

for classNo, cnt in studentCnts:
    print('{}학급 학생수 : {}'.format(classNo, cnt))
    sum += cnt

print('전체학생수 : {}'.format(cnt))
print('평균학생수 : {}'.format(sum / len(studentCnts)))

📖조건문; for() if()

🏷️for() if() 실습_1

minScore = 60
korScore  = int(input('국어 점수 : '))
engScore  = int(input('영어 점수 : '))
mathScore  = int(input('수학 점수 : '))
sciScore  = int(input('과학 점수 : '))
hisScore  = int(input('국사 점수 : '))

scores = [
    ['국어', korScore],
    ['영어', engScore],
    ['수학', mathScore],
    ['과학', sciScore],
    ['국사', hisScore]
]

for subject, score in scores:
    if score < minScore:
        print('{}과목 과락 : {}점'.format(subject, score))

📖while()

while()을 이용하면 다양한 방법으로 아이템 조회가 가능하다

🏷️실습_1

studentCnts = [
    [1,18],
    [2,19],
    [3,23],
    [4,21],
    [5,20],
    [6,22],
    [7,17]
]

sum =0
avg =0

✔️ n 하나 선언해 줌
n =0 
while n < len(studentCnts):
    classNo = studentCnts[n][0]
    cnt = studentCnts[n][1]
    print('{}학급 학생수 : {}'.format(classNo, cnt))

    ✔️ 반복문에서 합계는 ▼아래 처럼 씀! 외우자!
    sum += cnt
    ✔️ 무한 루프에 빠지지 않게 위해 써줌 & 계속 카운팅 해야 하니까
    n += 1

print('전체학생수 : {}명'.format(sum))
print('평균학생수 : {}명'.format(sum/len(studentCnts)))

📖조건문; while() if()

A> (2)번 풀이 상세 해설

n =0
while n < len(scores):

continue : 점수가 60점 이상이면, print 출력하지 마라

    if scores[n][1] >= minScore:
        n += 1
        continue

▼ 60점 미만이면 print 출력해라

print('{}과목 과락 : {}점'.format(scores[n][0], scores[n][1]))
    n += 1

🏷️while() if() 실습_1

minScore = 60
korScore  = int(input('국어 점수 : '))
engScore  = int(input('영어 점수 : '))
mathScore  = int(input('수학 점수 : '))
sciScore  = int(input('과학 점수 : '))
hisScore  = int(input('국사 점수 : '))

scores = [
    ['국어', korScore],
    ['영어', engScore],
    ['수학', mathScore],
    ['과학', sciScore],
    ['국사', hisScore]
]

n =0
while n < len(scores):
    if scores[n][1] < minScore:
        print('{}과목 과락 : {}점'.format(scores[n][0], scores[n][1]))

    n += 1

🏷️while() if() 실습_2

studentCnts = [
    [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(studentCnts):
    if minCnt == 0 or minCnt > studentCnts[n][1]:
        minClassNo = studentCnts[n][0]
        minCnt = studentCnts[n][1]

    if maxCnt < studentCnts[n][1]:
        maxClassNo = studentCnts[n][0]
        maxCnt = studentCnts[n][1]

    n += 1

print('학생수가 가장 적은 학급: {}반 {}명'.format(minClassNo, minCnt))
print('학생수가 가장 많은 학급: {}반 {}명'.format(minClassNo, maxCnt))

📖enumerate() 함수

index와 item을 한번에 조회할 수 있는 함수 ⭐

🏷️실습

sports = ['농구', '수구', '축구', '마라톤', '테니스']
favoriteSport = input('좋아하는 운동 입력 : ')

bestSportsIndex = 0
for idx, value in enumerate(sports):
    if value == favoriteSport:
        bestSportsIndex += idx + 1

print('{}는 {}번째에 있습니다.'.format(favoriteSport, bestSportsIndex))
  • bestSportsIndex = 내가 좋아하는 운동의 순서

  • value = 스포츠 이름

  • if value == favoriteSport:
    value가 favoriteSport(입력 받은 값)와 같을 때,

  • bestSportsIndex += idx + 1
    idx는 0부터 시작하기 때문에 +1을 더해준다.

🏷️실습_응용


📖append() _ 끝에 추가하기

append()함수를 이용하면 마지막 인덱스에 아이템을 추가할 수 있다.

🏷️실습_1

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

print('scores : {}'.format(scores))

for subject, score in scores:
    print('과목: {} \t 점수: {}'.format(subject, score))

🏷️실습_2

myFamily = [['아빠',40], ['엄마',38], ['나', 9]]
myFamily.append(['동생',1])

print('myFamily : {}'.format(myFamily))

for name, age in myFamily:
    print('호칭: {} \t 나이: {}'.format(name, age))

📖insert() _ 내가 원하는 어디든

words.insert(1, 'am')
(1, 'am') = (끼눠 넣고 싶은 자리, 아이템)

🏷️실습_1

▶ 오름차순이 유지될 수 있도록 입력하는 값에 맞춰, 알아서 자리에 알맞게 들어가는 프로그램 만들기.

numbers = [1,3,6,11,45,54,62,74,85]
inputNumber = int(input('숫자 입력 : '))

insertIdx = 0

for idx, number in enumerate(numbers):
    print(idx, number)

    if insertIdx == 0 and inputNumber < number:
        insertIdx = idx

numbers.insert(insertIdx, inputNumber)
print(numbers)
  • if insertIdx == 0 and inputNumber < number:
    사용자가 입력한 숫자를 [기존 리스트 숫자]와 비교하면서 작은 자리를 찾아가는 과정.

  • insertIdx = idx
    자리를 찾았다!!


📖pop() _ 삭제

🏷️삭제 방법

🏷️삭제한 아이템을 알고 싶을 때

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

▼ rValue 이용

rValue = students.pop()
print('rValue: {}'.format(rValue))

🏷️실습_1

최저, 최고 점수를 제거하는 프로그램

A> full.ver

playerScores = [9.5,8.9,9.2,9.8,8.8,9.0]
print('playerScore : {}'.format(playerScores))

minScore = 0; maxScore = 0
minScoreIdx = 0; maxScoreIdx = 0

for idx, score in enumerate(playerScores):
    if idx == 0 or minScore > score:
        minScoreIdx = idx
        minScore = score
print('minScore : {}, minScoreIdx: {} '.format(minScore, minScoreIdx))
playerScores.pop(minScoreIdx)


for idx, score in enumerate(playerScores):
    if maxScore < score:
        maxScoreIdx = idx
        maxScore = score
        
print('maxScore : {}, maxScoreIdx: {} '.format(maxScore, maxScoreIdx))
playerScores.pop(maxScoreIdx)

print('playerScore : {}'.format(playerScores))



A> 해설.ver

▶ print로 잘 나오는지 확인

playerScores = [9.5,8.9,9.2,9.8,8.8,9.0]
print('playerScore : {}'.format(playerScores)) 

▶ 변수 선언

minScore = 0; maxScore = 0
minScoreIdx = 0; maxScoreIdx = 0

▶ [최저 구하기: minScore, minScoreIdx]

1. enumerate() 함수 활용

for idx, score in enumerate(playerScores):
  1. 반복문

    ▼ 반복문 1차 실행
    idx == 0 으로 처음으로 돌아감
    minScore = 9.5 , minScoreIdx = [0] 이 됨

    ▼ 반복문 2차 실행
    idx == 0 이 아니기 때문에 minScore > score: 조건을 봐야 함
    현재 minScore에는 9.5가 있는데, 9.5가 다음 점수보다 크다면 다음점수로 바껴야 함
    이런 식으로 계속 비교해가며 반복하다 보면 우리가 원하는 최소, 최대를 구할 수 있음

    if idx == 0 or minScore > score:
        minScoreIdx = idx
        minScore = score
  1. 한번에 삭제하면 index가 틀어질 수 있어서 print 후 최저, 최고 각각 다음에 삭제해야 함
print('minScore : {}, minScoreIdx: {} '.format(minScore, minScoreIdx))
playerScores.pop(minScoreIdx)

▶ [최대 구하기: maxScore, maxScoreIdx]

for idx, score in enumerate(playerScores):
    if maxScore < score:
        maxScoreIdx = idx
        maxScore = score
print('maxScore : {}, maxScoreIdx: {} '.format(maxScore, maxScoreIdx))
playerScores.pop(maxScoreIdx)

▶ 마지막 출력

print('playerScore : {}'.format(playerScores))


📖remove() _ 특정 아이템 삭제

⭐ remove() : 1개의 아이템만 삭제가 가능
⭐ remove() + while() : 2개 이상 삭제 가능

🏷️1개 (단일) 삭제 방법

students = ['K', 'G', 'D', 'H', 'R', 'S', 'G']
print(students)

students.remove('G')
print(students)

→['K', 'G', 'D', 'H', 'R', 'S', 'G']
→['K', 'D', 'H', 'R', 'S', 'G']

🏷️2개 이상 삭제 방법

students = ['K', 'G', 'D', 'H', 'R', 'S', 'G']
print(students)

while 'G' in students:
    students.remove('G')

print(students)

→['K', 'G', 'D', 'H', 'R', 'S', 'G']
→['K', 'D', 'H', 'R', 'S']

🏷️실습


📖 extend() _ 연결/확장

extend() 함수를 이용하면 리스트에 또 다른 리스트를 연결(확장)할 수 있다.

📌extend() _ 확장의 의미

확장된다
연결이 왜 확장이지?
이해가가 가지 않아 아래와 같이 다시 정리해보았다.

1번 : [a b c]
2번 : [d e f]

(1번) (extend) (2번) → 1번: [a b c d e f]

각 2개의 개체가 더해져, 1번의 개체가 길어졌기 때문이다..!!

📌 + _ 새로운 개체 탄생

반면, +로 연결하는 경우를 보자

1번 : [a b c]
2번 : [d e f]

(1번) (extend) (2번) → 3번: [a b c d e f]

각 2개의 개체가 더해져, 새로운 3번 개체가 생성되었다.
즉, 1,2번은 그대로 있고 새로운 3번이 생겨난 것!

(+)추가로,
3번을 1번 처럼 사용하고 싶다?
그렇다면 1번 = 3번 연산자를 넣어 코딩하면 된다!

🏷️실습_1

▶ 나/친구 중복 번호 : 3,5
▶ 중복 번호는 각 1번 씩만 나올 수 있도록 프로그램을 만들어야 함

myFavNumber = [1,3,5,6,7]
freFavNumber = [2,3,5,8,10]

print('myFavNumber: {}'.format(myFavNumber))
print('freFavNumber: {}'.format(freFavNumber))

addList = myFavNumber + freFavNumber
print('addList: {}'.format(addList))

result = []
for number in addList:
    if number not in result:
        result.append(number)

print('result: {}'.format(result))

✔️중복 안되게 item 뽑는 방법

❓왜 이렇게 쓰지?
▶ 반복을 돌면서 number 하나씩 뺴주는 문장 (중복 item 삭제)

  • 그 뺀 item(number)이 result에 없어
  • addList(숫자를 더한 리스트)에 number가 없다면
  • number를 추가해라
    → 동일한 숫자(number)를 제외한 item들만 result[]에 추가 됨 ⭐
result = []
for number in addList:
    if number not in result:
        result.append(number)

📖 sort() _정렬

sort()함수를 이용하면 item을 정렬할 수 있다.

🏷️실습_1

(1) List 나열
→ playerScore: [9.5, 8.9, 9.8, 9.8, 8.8, 9.0]

playerScore = [9.5,8.9,9.8,9.8,8.8,9.0]

print('playerScore: {}'.format(playerScore))

(2) 정렬 >> pop() 삭제

  • 오름차순 정렬
  • 가장 작은 수 삭제 .pop(0) <- [0]번 인덱스 삭제
  • 가장 큰 수 삭제 .pop(len(playerScore)-1 <- 전체 길이에서 뒤에서 1개 삭제
    → playerScore : [8.8, 8.9, 9.0, 9.5, 9.8, 9.8]
    → playerScore : [8.9, 9.0, 9.5, 9.8]
playerScore.sort()
print('playerScore : {}'.format(playerScore))

playerScore.pop(0)
playerScore.pop(len(playerScore)-1)
print('playerScore : {}'.format(playerScore))

(3) 총점 & 평균 출력
→ 총점 : 37.2; 평균 : 9.3

sum =0
avg =0
for score in playerScore:
    sum += score
avg = sum / len(playerScore)

print('총점 : {}'.format(sum))
print('평균 : {}'.format(avg))

📖 reverse() _ 순서 뒤집기

numbers = [2,3,4,5,6]
print('numbers : {}'.format(numbers))

numbers.reverse()
print('numbers : {}'.format(numbers))

→ numbers : [2, 3, 4, 5, 6]
→ numbers : [6, 5, 4, 3, 2]


📖 [n:m] _ 리스트 슬라이싱

원하는 아이템만 뽑아내는 방법

  1. item 슬라이싱 | number = [1,2,3,4,5,6,7,8,9]
    print('number : {}'.format(number))
    → number : [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print('number : {}'.format(number[2:4]))
    → number : [3, 4
    print('number : {}'.format(number[:4]))
    → number : [1, 2, 3, 4]
    print('number : {}'.format(number[2:]))
    → number : [3, 4, 5, 6, 7, 8, 9]
    print('number : {}'.format(number[2:-2]))
    → number : [3, 4, 5, 6, 7]

  2. 문자열 슬라이싱 | str = 'abcdefghijklmn'
    print('str length: {}'.format(len(str)))
    -> str length: 14
    print('str: {}'.format(str))
    -> str: abcdefghijklmn
    print('str: {}'.format(str[2:4]))
    -> str: cd
    print('str: {}'.format(str[:4]))
    -> str: abcd
    print('str: {}'.format(str[2:]))
    -> str: cdefghijklmn
    `print('str: {}'.format(str[2:-2]))
    -> str: cdefghijkl
    print('str: {}'.format(str[-5:-2]))
    -> str: jkl

  3. 단계 설정 | number = [1,2,3,4,5,6,7,8,9]
    print('number : {}'.format(number[2:-2:2]))
    -> number : [3, 5, 7]
    print('number : {}'.format(number[::2]))
    -> number : [1, 3, 5, 7, 9]

  1. 아이템 변경(할당연산자 사용) ⭐
students = ['H', 'G', 'K', 'S']
students[1:3] = ['Park', 'Kim']

print('students : {}'.format(students))

-> students : ['H', 'Park', 'Kim', 'S']


📖 slice() _ item 슬라이싱

  1. [n:m] | str = 'abcdefghijklmn'
    print('str: {}'.format(str[2:4]))
    -> str: cd

  2. slice() | str = 'abcdefghijklmn'
    print('str: {}'.format(str[slice(2,4)])) ✔️
    -> str: cd

  3. [n:m] | str = 'abcdefghijklmn'
    print('str: {}'.format(str[2:]))
    -> str: cdefghijklmn

  4. slice() | str = 'abcdefghijklmn'
    print('str: {}'.format(str[slice(2, len(str))])) ✔️
    -> str: cdefghijklmn


📖 곱셈 연산

곱셈 연산하면 아이템이 반복된다

numbers = [2,10,15,20,25,30]
print('numbers: {}'.format(numbers))

numMul = numbers * 2
print('numMul: {}'.format(numMul))

numbers: [2, 10, 15, 20, 25, 30]
numMul: [2, 10, 15, 20, 25, 30, 2, 10, 15, 20, 25, 30]

📖 item 위치 찾기

1.숫자'15'번이 몇번째 인덱스를 갖고 있는지 알고 싶을 떄 사용

numbers = [2,10,15,20,25,30]
print('numbers: {}'.format(numbers))

searchIdx = numbers.index(15)
print('searchIdx: {}'.format(searchIdx))

numbers: [2, 10, 15, 20, 25, 30]
searchIdx: 2

2.숫자'25'번이 2~6중 몇번째 인지 알고 싶을 때 사용

numbers = [2,10,15,20,25,30]
print('numbers: {}'.format(numbers))

searchIdx = numbers.index(15, 2, 6)
print('searchIdx: {}'.format(searchIdx))

numbers: [2, 10, 15, 20, 25, 30]
searchIdx: 2

🏷️ 실습

import random

sampleList= random.sample(range(1,11),10)
   ✔️ range(1,11),10) : 1~10까지 10가지 숫자


selectIdx = int(input('숫자7의 위치 입력 : '))
searchIdx = sampleList.index(7)

if searchIdx == selectIdx:
    print('빙고')
else:
    print('ㅠㅠ')

print('sampleList: {}'.format(sampleList))
print('searchIdx: {}'.format(searchIdx))

📖 특정 item의 개수 알아내기

numbers = [2,10,15,20,20,15,10,2,25,30]
print('numbers: {}'.format(numbers))

searchCnt = numbers.count(15)
print('searchCnt: {}'.format(searchCnt))

numbers: [2, 10, 15, 20, 20, 15, 10, 2, 25, 30]
searchCnt: 2

📖 특정 item 삭제

numbers = [2,10,15,20,20,15,10,2,25,30]
print('numbers: {}'.format(numbers))

del numbers[1:3]
print('numbers: {}'.format(numbers))

del numbers[2]
print('numbers: {}'.format(numbers))

numbers: [2, 10, 15, 20, 20, 15, 10, 2, 25, 30]
--------------------------------------------------
numbers: [2, 20, 20, 15, 10, 2, 25, 30]
--------------------------------------------------
numbers: [2, 20, 15, 10, 2, 25, 30]

🏷️실습

import  random

types = ['A','B','AB','O']
todayData = []
typeCnt = [] # 타입별 갯수

for i in range(100): # 100개의 혈액형 정보가 있다고 설정. for 반복 100번
    type = types[random.randrange(len(types))] # types에서 무작위random로 뽑기randrange위해 types의 갯수len만큼
    todayData.append(type) #todayData에 하나씩 추가

print('todayData: {}'.format(todayData)) # 결과 출력
print('todayData length: {}'.format(len(todayData))) # 길이 출력 ('100'으로 뜨면 정상)

for type in types: # 각 혈액형 별 갯수를 알고 싶다
    print('{}형 : {}개',format(type, todayData.count(type))) # 어떤 형은 몇개인지 출력
    #todayData 에서 해당하는 혈액형의 갯수를 count, 괄호안에는 type 설정

출처/참고
제로베이스 데이터 스쿨
이터러블 개념 정리_https://blog.naver.com/jjt2345/223013381264
profile
비전공자의 데이터 공부법

0개의 댓글