데이터 분석 학습일지🐣

12일차 - 시퀀스 자료형 - 리스트, 튜플, 딕셔너리 (2), if 조건문

boiled egg 2023. 7. 7. 04:59

Date : 2023-07-05

Topic : 시퀀스 자료형(⭐리스트, 튜플, 딕셔너리 etc), if 조건문


Note

딕셔너리 만들기

  • ex1) "영문 이름"을 입력하면 "한글 이름"이 출력되도록
fruits={'apple':['사과',1000], 'banana':['바나나',700],'orange':['오렌지',1500],'pineapple':['파인애플',2000]}
sel=input("과일 이름을 입력하세요: ")
print("선택한",fruits[sel][0],"의 가격은",fruits[sel][1],"원입니다.")

#output:

더보기

과일 이름을 입력하세요: apple
선택한 사과 의 가격은 1000 원입니다.

  • ex2) 사과 가격을 입력 받은 금액으로 변경해보기
fruits={'apple':['사과',1000], 'banana':['바나나',700],'orange':['오렌지',1500],'pineapple':['파인애플',2000]}
sel=int(input("변경된 사과 가격을 입력하세요: ")) #input()은 문자열로 출력되므로 int() 사용
fruits['apple']=sel
print("변경된 사과 가격은",fruits,"입니다.")

#output:

더보기

변경된 사과 가격을 입력하세요: 500
변경된 사과 가격은 {'apple': 500, 'banana': ['바나나', 700], 'orange': ['오렌지', 1500], 'pineapple': ['파인애플', 2000]} 입니다.

# map(func, input().split()) 자주 사용

# map(func, sequence) : 시퀀스 자료형의 요소를 지정된 함수로 처리해주는 함수.
#원본 리스트를 변경하지 않고 새 리스트를 형성

list(map(func, list))
tuple(map(func, tuple))

# map object는 iterable -> 변수 여러 개에 저장하는 unpacking이 가능.
# ex)
a,b = map(int, input().split())

# 아래처럼 풀어서 쓸 수 있다.
x = input().split()    # input().split()의 결과는 문자열 리스트
m = map(int, x)        # 리스트의 요소를 int로 변환, 결과는 맵 객체
a, b = m               # 맵 객체는 변수 여러 개에 저장할 수 있음
  • ex3) 과일 가격 입력하
fruits={'apple':0, 'banana':0,'orange':0,'pineapple':0}
ai,bi,oi,pi=map(int,input("과일 가격을 사과, 바나나, 오렌지, 파인애플 순으로 입력(/구분): ").split('/'))
fruits['apple']=ai
fruits['banana']=bi
fruits['orange']=oi
fruits['pineapple']=pi
print(fruits)

'''output
과일 가격을 사과, 바나나, 오렌지, 파인애플 순으로 입력(/구분): 700/600/800/1000
{'apple': 700, 'banana': 600, 'orange': 800, 'pineapple': 1000}
'''

If 조건문

: 특정 조건일 때 코드 실행

num=int(input())
if num==7:
    print("행운")
num=int(input())
if num>=10:
    print("크다")
  • 중첩 if 조건
x=15
if x>=10:
    print('10 이상입니다.')
    if x==15:
        print('15입니다.')
    if x==20:
        print('20입니다.')

'''output
10 이상입니다.
15입니다.
'''
# 중접if문에 'x==' 조건이 성립하지 않으면 상위 if만 출력
# x=18일 경우
'''output
10 이상입니다.
'''

< 실습 >

  • ex1) 정수값을 입력하고 홀수인지 짝수인지 판별하기
int_num=int(input('값(정수):'))

if int_num%2==0:	# 자주 사용함
    print("짝수")
if int_num%2==1:
    print("홀수")

#or

int_num=int(input('값(정수):'))

if int_num%2==0:
    print("짝수")
else:
    print("홀수")
  • ex2) 정수값을 입력하고 10보다 큰지 작은지, 같은지 판별하기
int_num=int(input('값(정수):'))

if int_num>10:
    print('10보다 크다.')
if int_num==10:
    print('10과 같다.')
if int_num<10:
    print('10보다 작다.')
    
#or

int_num=int(input('값(정수):'))

if int_num>10:
    print('10보다 크다.')
elif int_num==10:
    print('10과 같다.')
else:
    print('10보다 작다.')
  • else 사용하기
int_num=int(input('값(정수):'))

if int_num==10:
    print('10입니다.')
else:
    print('10이 아닙니다.')
  • if 조건문의 동작 방식 : True는 if 코드 실행, False는 else 코드 실행
  • if 조건문에 숫자 지정 : 정수, 실수, 2,8,16진수 상관 없이 0이면 거짓
if 0:
    print('참') #거짓
else:
    print('거짓')
    
if 1:
    print('참') #참
else:
    print('거짓')
    
if 0x1F:
    print('참') #16진수 / 참
else:
    print('거짓')
    
if 0b1000:
    print('참') #2진수 / 참
else:
    print('거짓')
    
if 13.5:
    print('참') #실수 / 참
else:
    print('거짓')
  • if 조건문에 문자열 지정 : 어떤 문자열이든 값이 있으면 참, 빈 값은 거짓
  • if 조건식을 여러 개 지정 : 논리 연산자 사용(and, or, not)
x=10
y=20
if x==10 and y==20:
    print('True')
else:
    print('False')
  • 중접 if 조건문과 논리 연산자
if x>0:
    if x<20:
        print('20보다 작은 양수입니다.')
        
#or

if x>0 and x<20:
    print('20보다 작은 양수입니다.') #파이썬 권장 코드
    
#or

if 0<x<20:
    print('20보다 작은 양수입니다.')

< 실습 >

  • ex0) 쿠폰 적용하여 할인 받기
nMoney=int(input('값 입력:'))
strCp=input('쿠폰 입력:')
# 'Cash3000'은 3000원 할인, 'Cash5000'은 5000원 할인

if strCp=='Cash3000':
    if nMoney>=3000:
        print(nMoney-3000)
    else:
        print('금액이 부족합니다.')
if strCp=='Cash5000':
    if nMoney>=5000:
        print(nMoney-5000)
    else:
        print('금액이 부족합니다.')
  • ex1) 필기 커트라인 80 이상, 코딩테스트 합/불 (True/False), "합격", "불합격"이 출력되도록 소스 코드 작성하기
written_test=75
coding_test=True

if written_test>=80 and coding_test==True:
    print("합격")
    
else:
    print("불합격")
    
#op: 불합격 (필기가 75점이어서 and 연산자 X)
result_wri=int(input("필기 점수: "))
coding_test=input("합격 / 불합격: ")

if result_wri>=80 and coding_test=='합격':
    print("합격")

else:
    print("불합격")
  • ex2) 과목 점수를 입력하고 과목 평균이 80 이상이면 합격, 그렇지 않으면 불합격으로 출력.
    (단, 각 과목은 0~100 범위로만 입력할 수 있고 이외의 점수를 입력하면 잘못된 점수로 출력할 것.)
kor=int(input("국어: "))
eng=int(input("영어: "))
math=int(input("수학: "))
sci=int(input("과학: "))
avg=(kor+eng+math+sci)/4

if(0<=kor<=100 and 0<=eng<=100 and 0<=math<=100 and 0<=sci<=100):
    if avg>=80:
        print("합격")
    else:
        print("불합격")
else:
    print("잘못된 점수")
  • ex3) 음료수 뽑기
button=int(input('음료수 번호를 입력하세요(1.콜라, 2.사이다, 3.환타) : '))

if button==1:
    print('콜라')
elif button==2:
    print('사이다')
elif button==3:
    print('환타')
else:
    print('제공하지 않는 메뉴')
  • ex4) 학생인지 아닌지 체크
# 중첩 조건문 if (if 안에 if)
stu=int(input("학생:1/학생 아님:0 입력 : "))

if stu==1:
    myStr="학생이며"
    w_class=int(input("초등학생:1/중학생:2/고등학생:3 : "))
    if w_class==1:
        print(myStr, '초등학생입니다.')
    elif w_class==2:
        print(myStr, '중학생입니다.')
    elif w_class==3:
        print(myStr, '고등학생입니다.')	# elif, else는 생략 가능. 고등학생 조건을 넣어주기 위해 elif 사용
else:
    print("학생이 아닙니다.")
  • ex5) 자판기 음료 뽑기
money=int(input("금액 입력 : "))
button=int(input("음료선택 1.콜라/600원, 2.사이다/700원, 3.환타/800원 : "))

if button==1:
    if money>=600:
        print("콜라", "/ 잔액 :", money-600)
    else:
        print("금액 부족")
elif button==2:
    if money>=700:
        print("사이다", "/ 잔액 :", money-700)
    else:
        print("금액 부족")
elif button==3:
    if money>=800:
        print("환타", "/ 잔액 :", money-800)
    else:
        print("금액 부족")
else:
    print("잘못된 선택")
  • ex6) 변수 x가 11과 20 사이면 '11~20', 21과 30 사이면 '21~30', 아무것도 해당하지 않으면 '아무 것도 해당하지 않음' 출력
x=int(input())

if 11<=x<=20:
    print('11~20')
elif 21<=x<=30:
    print('21~30')
else:
    print('아무것도 해당하지 않음')
  • ex7) 교통카드 잔액
age=int(input('나이: '))
balance=9000    #교통카드 잔액

if (7<=age<=12):
    balance=balance-650
elif (8<=age<=18):
    balance=balance-1050
elif (age>=19):
    balance=balance-1250
else:
    balance=balance    # 7세 미만은 무료를 의미
print(balance)         # 잔액 출력
  • ex8) 한 점을 구정하는 x,y 좌표를 입력 받고 몇 사분면에 있는지 판별하는 프로그램을 작성
# 내가 작성한 코드
x=int(input('x좌표:'))
y=int(input('y좌표:'))

if x>0 and y>0:
    print('1사분면')
elif x<0 and y>0:
    print('2사분면')
elif x<0 and y<0:
    print('3사분면')
elif x>0 and y<0:
    print('4사분면')
else:
    print('사분면에 해당하는 data가 아닙니다.)
# map함수, 리스트 인덱스 활용한 코드
xy=list(map(int,input('x,y값을 입력(","로 구분) : ').split(',')))
# 입력값을 map함수로 정수형으로 변환 뒤 리스트로 출력

if 0<xy[0] and 0<xy[1]:   #xy=[x,y], xy[0]은 x좌표, xy[1]은 y좌표. 
    print('1사분면에 있습니다.')
elif 0>xy[0] and 0<xy[1]:
    print('2사분면에 있습니다.')
elif 0>xy[0] and 0>xy[1]:
    print('3사분면에 있습니다.')
elif 0<xy[0] and 0>xy[1]:
    print('4사분면에 있습니다.')
else:
    print('사분면에 존재하지 않는 data입니다.')
  • ex9) 사각형 안의 한 점 판단
    • 한 점을 구성하는 x,y 좌표를 입력 받고, 이 점이 (50,40), (50,80), (100,40), (100,80)을 꼭짓점으로 갖는 사각형 안에 있는지 판별하는 프로그램 작성하기 (hint: 좌표 위에 사각형을 그려본다.)
# 내가 짠 코드
xy=list(map(int,input('x,y값을 입력(","로 구분) : ').split(',')))

if 50<=xy[0]<=100 and 40<=xy[1]<=80:
    print('사각형 안에 있습니다.')
else:
    print('사각형 안에 없습니다.')

#아래처럼 짤 수도 있다.

nx, ny=map(int,input("'x,y' 형태로 좌표 입력: "))

if (nx>=50 and nx<=100) and (ny>40 and ny<80):
    print("사각형 안에 있습니다.")
else:
    print("사각형 안에 없습니다.")

 

< 예제 >

  • ex1) 입력한 색상이 리스트에 포함되었는지 확인
    • colors라는 색상표 리스트가 다음과 같이 선언되었음
colors = ['red', 'orange', 'blue', 'green', 'white', 'black', 'dark blue', 'purple']
colors=['red', 'orange', 'blue', 'green', 'white', 'black', 'dark blue', 'purple']
color=input('색상 입력: ')

if color in colors: #리스트에 포함되는지 확인 in
    print('중복')
else:
    print('신규')
  • ex2) 입력한 값에서 20을 더하여 출력. 단, 20을 더한 출력값이 225를 초과하는 값은 225로 출력한다.
num=int(input("값 입력:"))

if num+20>225:
    num=225
else:
    num=num+20		# 입력값+20이 225를 넘지 않을 경우
print("출력값:", num)
  • ex3) 입력한 값에서 20을 빼서 출력. 단, 20을 뺀 출력값이 음수일 경우는 0으로 출력, 225를 초과하는 값은 225로 출력한다.
num=int(input("값 입력:"))

if num-20<0:
    num=0
elif num-20>225:
    num=225
else:
    num=num-20
print("출력값:", num)
  • ex4) 시간을 입력하여 정각인지 아닌지 판별하기
    • if문 활용
    • list 활용
    • slice 활용
# if문 활용하기
hour,min=input("시간 입력(hh:mm): ").split(':')
    # ':'를 기준으로 각각 hour, min으로 문자열이 분리

if min=='00':
    print("정각입니다.")
else:
    print("정각이 아닙니다.")

# list 활용하기
time=list(map(int,input("시간 입력(hh:mm): ").split(':')))
print(time[0],"시",time[1],"분")

if time[1]==00:
    print('정각입니다.')
else:
    print('정각이 아닙니다.')

# slice 활용하기
t=input("시간 입력(hh:mm): ")

    # hh:mm에서 3번째 인덱스부터 구하면 mm만 슬라이싱
    # 문자열이므로 숫자 0 이 아닌 '00'으로 정확히 입력
if t[3:]=='00':
    print("정각입니다.")
else:
    print("정각이 아닙니다")
  • ex5) 나이를 입력하고 성년/미성년 판별하기. 단, 나이는 10세부터 99세만 입력한다.
# 처음 짠 코드 : 길고 번잡하다. 순서를 생각해서 다시 짜보기
age=int(input("나이 입력: "))

if 10<=age<=99:
    if age>=19:
        print("성년입니다.")
    elif age<19:
        print("미성년입니다.")
    else:
        print("입력 범위를 벗어난 값입니다")
else:
    print("입력 범위를 벗어난 값입니다")
    
# 다시 짠 코드 : 정상 작동.
age=int(input("나이 입력: "))

if age<10 or age>99:	#하나라도 범위를 벗어나면 안되니까 'or'
    print("입력 범위를 벗어난 값입니다")
elif age>=19:
    print("성년입니다.")
elif age<19:
    print("미성년입니다.")
    
# elif, else는 생략 가능하다.
# 1. if문은 먼저 조건을 만족하면 이후 조건은 모두 무시한다.
# 2. 따라서 입력값의 요구사항을 if문으로 먼저 작성한 뒤,
# 3. 입력값이 10~99라는 값을 만족하면 이후에 elif문으로 성년/미성년을 판별하도록 작성한다.

# slice 활용1
age=input("나이 입력:")
print(age,"세")

age=int(age[:3])	#나이가 세 자리(100->[0],[1],[2])일 수 있으므로 [0:3]으로 슬라이싱해준다.
if age<10 or age>99:
    print("입력 범위를 벗어난 값입니다")
elif age>=19:
    print("성년")
else:
    print("미성년")
    
# slice 활용2 - 내 기준 제일 직관적이다.
age=input("나이 입력(세):")
age=int(age[:3])

if 19<=age<=99:
    print("성년")
elif 10<=age<=18 :
    print("미성년")
else:
    print("입력 범위를 벗어난 값입니다")
    
# 슬라이싱을 len()으로
age=input("나이 입력(00세): ") #'00세'로 입력
n_age=int(age[:len(age)-1]) #글자수 '세'에 해당하는 -1 해주면 '00' 나이만 길이 구해짐.

if n_age>99 or n_age<10:
    myStr="잘못된 입력입니다."
elif 10<=n_age<=19:
    myStr="미성년입니다."
else:
    myStr="성년입니다"
print(myStr)	#만족 조건을 변수로 설정하고 print(변수)로 출력
  • ex6) 주민번호 뒷자리 맨 앞 번호를 입력 받아 여자인지 남자인지 확인하는 코드 작성하기
    7자리 자릿수가 틀렸다면 오류 메시지를 표시하고 종료한다. 
    • 여자는 2,4
    • 남자는 1,3
Id=input("주민번호 뒤 7자리: ") #변수 주의 id(x), Id(o)

if len(Id)!=7:	#주민번호 뒷자리는 7자리이므로 아닐 경우(!=) 오류 표시.
    print("잘못된 자릿수입니다.")
else:
    Id=int(Id[0])	#input 출력값은 문자형이므로 int 사용. Id[0]은 주민번호 뒷자리 맨 앞 번호.
    if Id==1 or Id==3:
        print("남자")
    elif Id==2 or Id==4:
        print("여자")
    else:
        print("잘못된 입력입니다")
  • ex7) 자판기 음료 뽑기. 단, 입금 최대 금액은 10000원이며 선택 음료보다 금액 부족 시 메시지 표시.
    1. 사이다 700원
    2. 콜라 600원
    3. 오렌지주스 800원
price = int(input("금액을 입력하세요(최대 1만원):"))
drink = int(input("음료선택 1.사이다 700원, 2.콜라 600원, 3.오렌지쥬스 800원 : "))

if price>10000:
    print("최대 금액 초과")	#1만원이 넘는다면 금액 초과 오류 메시지
else:
    if drink==1:
        if price<700:		#음료값보다 넣은 금액이 적으면 잔액 부족 메시지
            print("잔액 부족")
        else:			#상위 조건을 모두 만족하면 결제 비용 제외 후 잔액 반환
            print("잔액:",price-700)
    elif drink==2:
        if price<600:
            print("잔액 부족")
        else:
            print("잔액:",price-600)
    elif drink==3:
        if price<800:
            print("잔액 부족")
        else:
            print("잔액:",price-800)
    else:
        print("잘못된 선택")	#3가지 음료 외 다른 입력 시 오류 메시지
        
#들여쓰기와 같은 level의 구문 체크 주의하기

✅고민해보고 수정하기!!

더보기

딕셔너리를 이용해 상기 코드를 아래와 같이 간결하게 작성할 수도 있다.

그러나 3가지 음료(menu_dict의 key 1,2,3) 이외에 다른 값을 입력하면 잘못된 선택이라는 오류를 표시해야 하는데 아직 해결하지 못했다. 

input_money=int(input("금액을 입력하세요: "))
menu_dict={"1":700, "2":600, "3":800}

if input_money>10000:
    print("최대 금액 초과")
else:
    input_menu=input("음료 선택: ")
    if input_money-menu_dict[input_menu]<0:
        print("금액 부족")
  # elif menu_dict.keys():
  #	print("잘못된 선택") <- 어떻게 작성해야 하지?
    else:
        return_money=input_money-menu_dict[input_menu]
        print("잔액은",return_money,"원입니다.")

for 반복문

for 변수 in sequence자료형

#for반복문으로 'Hello, World!' 100번 출력
for i in range(100):
    print('Hello, world!')
nStart=int(input("시작 숫자:"))
nEnd=int(input("끝 숫자: "))
nInterval=int(input("간격: "))

if (nStart>nEnd) and nInterval <0:
    nEnd=nEnd+1
    for i in range(nStart, nEnd, nInterval):
        print(i)
elif (nStart<nEnd) and nInterval >0:
    for i in range(nStart, nEnd, nInterval):
        print(i)
else:
    print("입력된 내용이 적절하지 않습니다.")

이론 같은 그 날 배운 개념을 따로 작성해두는 것도 좋지만, 파이썬 수업은 실습 위주인 만큼 코드를 직접 작성하는 것이 복습 겸 개념 정리에 좋은 것 같다. 특히 코드를 입력해두고 #주석 처리를 하면 자주 헷갈리는 것이나 중요한 핵, 실수한 코드에 대한 오답노트처럼 표기할 수 있어서 당분간 학습일지는 이렇게 작성할 듯 싶다. 아직도 기초가 제대로 안잡혀서 문제 이해도 오래 걸리고 코드 짜는데도 억겁의 시간이 필요하지만 하나 하나 분석해서 이해하다 보니 개념 정리가 되고 있는 것 같다. 파이썬 수업 시작 이후로 수업 따라가는 것만으로도 벅차서 하루 일과에 정규 수업 시간을 빼면 하루 종일 문제만 붙잡고 풀고 있다. 특히 프로그래밍 특성상 여러 방식으로 시도해볼 수 있어서 더 시간이 오래 걸리는 것 같다. 아직 너무 힘든 단계이긴 하지만, 힘겹게나마 문제를 풀고 나면 생기는 그 성취감이 지금 나를 이끌어 주고 있다. 빨리 파이썬에 더 익숙해져서 한껏 더 재미 붙일 수 있으면 좋겠다.