오늘은 !! 앞으로 여러 문제들을 풀어나가며,
LIST
에 관해 궁금한 사항이 생기면 이 자료만으로도 참고할 수 있게 정리해보고자 한다.
앞선 강의들을 수강하며 궁금했던 부분들도 이번 정리를 통해 해결할 수 있었다!
배열과 흡사한 구조
여러개의 데이터를 나열한 자료 구조
students = ['홍길동', '박찬호', '이용규', '박승철']
[]를 이용해 선언하고 데이터 구분은 , 를 이용
'홍길동'은 아이템(요소)라고 한다.
숫자, 문자, 논리형 등 모든 기본 데이터를 같이
저장할 수 있다.
strs = [3.14, '십', 'one', '3.14']
리스트에 또 다른 컨테이너 자료형 데이터를 저장
할 수 있다.
인덱스란 아이템에 자동으로 부여되는 번호표 이다.
인덱스(index)
라고 한다.인덱스(index)
는 무.조.건 0
부터 시작한다. (변경 불가능)✔️ 번호를 통해 리스트에 접근!!이 가능
리스트의 길이 = 아이템의 수
len()
과 반복문
을 이용하면 리스트의 아이템 조회가 가능하다.
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
는 각각 1
과 19
를 가리킴 (자동으로 변수를 찾아감)
→ (출력) 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)))
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()을 이용하면 다양한 방법으로 아이템 조회가 가능하다
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)))
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
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
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))
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()함수를 이용하면 마지막 인덱스에 아이템을 추가할 수 있다.
scores = [['국어',88], ['영어',91]]
scores.append(['수학',96])
print('scores : {}'.format(scores))
for subject, score in scores:
print('과목: {} \t 점수: {}'.format(subject, score))
myFamily = [['아빠',40], ['엄마',38], ['나', 9]]
myFamily.append(['동생',1])
print('myFamily : {}'.format(myFamily))
for name, age in myFamily:
print('호칭: {} \t 나이: {}'.format(name, age))
words.insert(1, 'am')
(1, 'am') = (끼눠 넣고 싶은 자리, 아이템)
▶ 오름차순이 유지될 수 있도록 입력하는 값에 맞춰, 알아서 자리에 알맞게 들어가는 프로그램 만들기.
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
자리를 찾았다!!
students = ['홍길동','박찬호','이용규','박승철','김지은','강호동']
print('students : {}'.format(students))
print('students length : {}'.format(len(students)))
▼ rValue 이용
rValue = students.pop()
print('rValue: {}'.format(rValue))
최저, 최고 점수를 제거하는 프로그램
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차 실행
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
- 한번에 삭제하면 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() : 1개의 아이템만 삭제가 가능
⭐ remove() + while() : 2개 이상 삭제 가능
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']
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() 함수를 이용하면 리스트에 또 다른 리스트를 연결(확장)할 수 있다.
확장된다
연결이 왜 확장이지?
이해가가 가지 않아 아래와 같이 다시 정리해보았다.
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번
연산자를 넣어 코딩하면 된다!
▶ 나/친구 중복 번호 : 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))
❓왜 이렇게 쓰지?
▶ 반복을 돌면서 number 하나씩 뺴주는 문장 (중복 item 삭제)
result = []
for number in addList:
if number not in result:
result.append(number)
sort()함수를 이용하면 item을 정렬할 수 있다.
(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() 삭제
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))
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]
원하는 아이템만 뽑아내는 방법
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]
문자열 슬라이싱 | 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
단계 설정 | 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]
students = ['H', 'G', 'K', 'S']
students[1:3] = ['Park', 'Kim']
print('students : {}'.format(students))
-> students : ['H', 'Park', 'Kim', 'S']
[n:m] | str = 'abcdefghijklmn'
print('str: {}'.format(str[2:4]))
-> str: cd
slice() | str = 'abcdefghijklmn'
print('str: {}'.format(str[slice(2,4)]))
✔️
-> str: cd
[n:m] | str = 'abcdefghijklmn'
print('str: {}'.format(str[2:]))
-> str: cdefghijklmn
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]
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))
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
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 설정