Python

Python 기초(List, Dictionary) - AWS 풀스택 과정 (예습) 3일차

awspspgh 2024. 7. 4. 00:06

오늘은 list, tuple, dictionaty에 대해 배워보겠습니다.

제대로 들어가기 전에 어제 배웠던 while를 복습해보겠습니다.

목차
1. while 복습
2. list
3. tuple
4. dictionary
5. 느낀점

1. while 복습

바로 문제 하나를 풀어보면서 복습을 해보겠습니다.

- 사탕 자판기를 만드시오. (아래의 요구를 충족할 것)

1. 사탕의 재고는 10개이고 사탕 1개당 500원으로 판매한다.

2. 돈을 입력을 받으면 사탕 1개를 출력해주며

거스름돈이 많이 남으면 사탕을 더 구매할 수 있다.

3. 하나씩 구매할 때마다 재고가 하나씩 줄어들며 매출이 오른다.

4. 매번 구매할 때마다 사탕 재고 수를 알려주며 사탕 재고가 없어질 때까지 자판기를 반복한다.

 

- 풀이

먼저 입력된 금액이 부족할 때를 표현하자면 이렇게 됩니다.

if msg < money:      # 입력된 금액 부족
        print("금액이 부족합니다.")

거스름돈이 사탕 가격보다 높아야 사탕을 더 구매할 수 있으니 while을 이용해서 표현해야 합니다.

while changes >= money:          # 거스름돈이 사탕 가격보다 높음     
                msg2 = input("더 구매하시겠습니까? (Y / N) >>")
                if msg2.lower() == "y":            # 사탕을 더 구매함
                    candy -= 1
                    print("사탕 1개 출력 (재고 > %d)" % candy)
                    changes = changes - money
                    print("거스름돈 : %d" % changes)
                    total = total + money
                elif msg2.lower() == "n":               # 사탕을 더 구매 안 함
                    print("거스름돈 : %d" % changes)
                    print("이용해 주셔서 감사합니다, 매출 : %d" % total)

나머지 필요한 부분까지 다 정리를 하면

candy = 10   # 사탕 개수
money = 500   # 사탕 가격
total = 0   # 매출
stop = 0   # 중단

while candy > 0 :
    if stop == 1 :
        break
    msg = int(input("사탕 가격 %d원 >>" % money))
    changes = msg - money
    if msg < money:      # 입력된 금액 부족
        print("금액이 부족합니다.")
    elif changes >= money:   
            candy -= 1
            print("사탕 1개 출력 (재고 > %d)" % candy)
            print("거스름돈 : %d" % changes)
            total = total + money
            while changes >= money:          # 거스름돈이 사탕 가격보다 높음     
                msg2 = input("더 구매하시겠습니까? (Y / N) >>")
                if msg2.lower() == "y":            # 사탕을 더 구매함
                    candy -= 1
                    print("사탕 1개 출력 (재고 > %d)" % candy)
                    changes = changes - money
                    print("거스름돈 : %d" % changes)
                    total = total + money
                elif msg2.lower() == "n":               # 사탕을 더 구매 안 함
                    print("거스름돈 : %d" % changes)
                    print("이용해 주셔서 감사합니다, 매출 : %d" % total)
                    stop = 1
                    break
                else:           # 잘못 입력됨
                    print("잘못 입력되었습니다.")
                    stop = 1
                    break
    else:           # 사탕 -1
        candy -= 1
        print("사탕 1개 출력 (재고 > %d)" % candy)
        print("거스름돈 : %d" % changes)
        total = total + money
    if candy <= 0 :              # 사탕 재고 소진
        print("사탕 재고 소진, 매출 : %d" % total)
print("종료")

 

이렇게 길게 정리가 됩니다.. 이렇게 생각을 오랫동안 하게 되는 문제를 풀게 되면

확실히 몰랐던 개념에 대해 잘 이해가 됩니다.

 

2. list

1. 변수 = list()

2. 리스트 안에는 어떠한 자료형도 포함할 수 있습니다.

크게 2가지 정도로 리스트에 대해서 말할 수 있습니다.

리스트를 사용해보면서 리스트 활용에 대해서 보이도록 하겠습니다.

# 리스트 기본 형식
a = []
b = [1,2,3,4,5]
c = ['a','b','c','d']
d = [1,2,'a','b']
e = [1,2,[3,4,5]]

# 리스트 인덱싱 슬라이싱 가능.
print(b[1] + b[2])
print(c[1] + c[2])
# print(d[1] + d[2])  -------- 에러(불가능)
print(e[2][0])

print()
print(b[:3])
print(b[3:])
print(e[2][:2])

# len(list) : list 총 길이
print(len(a1))

# 리스트 수정하기
a1[0] = 7
print(a1)

# 리스트 값 수정하기 del 객체요소
del a1[0]
print(a1)

 

그 다음으로는 리스트와 함께 쓰이는 명령어에 대해 알아보겠습니다.

◎ 요소 추가 - append

test = [1,2,3]
test.append(4)
test.append(5)
print(test)

 

◎ 리스트 정렬 - sort

test[0] = 7
print(test)
test.sort()
print(test)

 

◎ 리스트 뒤집기 - reverse

a = ['t','e','s']
a.reverse()
print(a)

 

◎ 인덱스 반환 - index

print(a.index('s'))

 

◎ 리스트 요소 삽입 - insert

a.insert(0, 10)
print(a)

 

◎ 리스트 요소 제거 - remove

a.remove('s') # 리턴 값이 없음
print(a)

 

◎ 리스트 요소 추출 - pop

print(a.pop(0)) # index 사용 가능. (번지 지정 가능)
print(a)

 

◎ 리스트에 포함된 요소의 개수 세기 - count

a = ['t','e','s','t']
print(a.count('t'))
print(a)

 

◎ 리스트 확장 - extend

a.extend(['b','c'])
print(a)
b = ['g','h','j']
a.extend(b)
print(a)

 

◎ 리스트 컴프리헨션 

파이썬의 고유 기능입니다.

# [식 for 변수 in list]
# [식 for 변수 in list if 조건식]

예시를 하나 보여드리자면

result = [num for num in score if num >= 80]
# => socore에 있는 요소를 num으로 옮기는데 80이상이어야함

이렇게 표현할 수 있습니다.

 

이제 문제 하나를 풀어보겠습니다.

 

- 학생들의 점수를 입력 받아 리스트에 추가하고 점수는 n개만큼 입력하고, 리스트를 정렬하여 출력하며, 점수의 합계와 평균도 출력하고 점수가 80점 이상인 합격자의 수를 출력하시오.

# 준비
print("---------[ 점수 ]---------")
n = int(input("인원 수 >> "))        # 몇 명?
cut = int(input("합격 점수 >> "))        # 커트라인 몇 점?
sum = 0     # 합계
avg = 0     # 평균
score = []     # 리스트

# 점수 입력
while len(score) != n:         
    msg = int(input("점수 입력(남은 점수 %d개) >> " % ( n - (len(score) + 1 ))))
    if msg > 100 or msg < 0 :
        print("다시 입력")
    else:
        score.append(msg)

# 정리
score.sort()      # 오름차순 정렬 > sort(reverse=True) 내림차순 정렬
score.reverse()
print(score)
print("---------[ 결과 ]---------")

list80 =[]
# 점수 출력
for i in score:
    sum = sum + i
    avg = sum / len(score)
    if i >= cut :            # 합격자 수
        list80.append(i)
print("합계: %d점, 평균: %.2f점, 합격자: %d명" % (sum, avg, len(list80)))

 

3. tuple

튜플에 대해 정리하자면

1. 리스트와 거의 비슷합니다. (리스트 잠금 형태라고 생각하시면 됩니다.)

2. 리스트 [], 튜플 ()

3. 요소의 변경이 안 됩니다.

4. 인덱싱과 슬라이싱 가능합니다.

 튜플보다는 리스트를 더 많이 이용하기에 따로 문제나 예시는 하지 않고 넘어가겠습니다.

 

4. dictionary

딕셔너리에 대해 정리하자면 

# key value를 한 쌍으로 가지는 자료형
# {key:value, key:value, key:value ...}
# valu의 자료형은 제한이 없다.
# d = {}

이렇게 정리할 수 있습니다.

예제 하나를 보여드리겠습니다.

dic = {'hong':89, 'kim':97, 'pack':56, 'choi':84}
print(type(dic))
dic2 = {1:[1,2,3], 2:[4,5,6]}

(이제부터 보여드리는 개념들은 dic = {'hong':89, 'kim':97, 'pack':56, 'choi':84}를 생략하였습니다.)

◎ 값 추가 dic[key] = value

dic['lee'] = 99
print(dic)
dic2['kim'] = 99
print(dic)
del dic['lee']

 

◎ key 리스트 만들기 = keys()

print(dic.keys())
for i in dic.keys():
    print(i)

 

◎ value 리스트 만들기 = values()

print(dic.values())

 

◎ key value 쌍으로 튜플로 생성 = items()

print(dic.items())
for i in dic.items():
    print(i)

 

◎ 삭제 = clear()

dic.clear()
print(dic)

 

◎ key로 value값 얻기 = get()

print(dic.get('lee', -1))
print(dic.get('kim'))

◎ in

: 해당 키값이 딕셔너리에 있는지 확인 해줍니다.

# True / False로 리턴
print('kim' in dic)

 

자 이제 문제 하나를 풀어보면서 마무리 짓겠습니다.

 

- 3명의 학생 이름과 점수를 입력 받아 딕셔너리에 저장하고 출력하면 학생들의 점수의 합계와 평균을  출력하고 가장 높은 점수를 가진 학생의 이름을 출력하시오. (단, 가장 높은 점수를 가진 학생은 1명일 때만)

dic = {}
# n = int(input("학생의 수: "))
n = 3
num = 0
while num < 3 :       # for i in range(n)
    name = input("학생의 이름: ")
    score = int(input("학생의 점수: "))
    dic[name] = score
    num = num + 1

sum = 0
avg = 0

for i in dic.values():
    sum = sum + i
    avg = sum / 3
print("합계: %d점, 평균: %.2f점" % (sum, avg))
print(dic)

# 가장 높은 점수를 가진 학생의 이름을 출력

max = 0
max_key =''
for i in dic.keys():
    if dic.get(i) > max:
        max = dic.get(i)
        max_key = i
print("최우수자:%s" % max_key)

 

5. 느낀점

마지막에 풀었던 딕셔너리 문제의 해결을 하지 못해서 아쉬웠고 딕셔너리에 대해 헷갈리는 부분이 많았는데 예제 문제들을 풀면서 개념들을 이해할 수 있게 되었다. 점점 외워야 할 개념들이 많아져서 부담감이 들긴 하지만 외워야 내가 코딩을 할 때 편하게 쉽게 내가 원하는 대로 표현해나갈 수 있다고 생각하니 꼭 외워야 하겠다라는 생각이 들었다.