Big Bro's Studying Archive

Python 기초 5 : 딕셔너리와 튜플, 그리고 반복문 연습 본문

Big Data展

Python 기초 5 : 딕셔너리와 튜플, 그리고 반복문 연습

빅브로오 2020. 4. 10. 12:16

@author: Yoon Baek

5번째 시간 생각할 것들

딕셔너리 in Pyth와 리스트 in R의 유사성
: key - value 구조
딕셔너리나 시리즈, 데이터 프레임이 key를 가짐으로써
얻는 이득은 무엇이며 어떻게 활용할 수 있는가?
반복문은 중요하므로 항상 연습

2차원 형식의 리스트 출력

지난 시간에 배운 2차원 형식의 리스트를 출력해 보자.

z = 1
for i in range(0,3) :
    for j in range(0,3) :
        print(z, end = ' ')
        z = z + 1
    print()

출력되는 값을 기준으로 2차원 형식의 리스트를 입력

반대로 2차원 형식의 리스트를 입력하는 법

z = 1
outlist = []
for i in range(0,3) :
    inlist = []
    for j in range(0,3) :
        inlist.append(z)
        z = z + 1
    outlist.append(inlist)

0부터 3의 배수로 5 * 4 리스트 입력 및 출력

# 입력
z = 0
outlist = []
for i in range(0,4):
    inlist = []
    for j in range(0,5):
        inlist.append(z*3)
        z = z + 1
    outlist.append(inlist)

# 출력
for i in range(0,len(outlist)):
    for j in range (0,len(inlist)):
        print('%2d' % outlist[i][j], end = ' ')
    print()

 

튜플 (tuple)

  • 리스트와 동일한 자료구조(1차원, 서로 다른 데이터 타입 허용)
  • 수정불가(읽기전용)
  • 수정되면 안되는 참조용 생성시 필요

1. 생성

t1 = (1,2,3)
t2 = 1,2,3
t3 = (10,)   # 하나면 ,를 찍어서 튜플이라는 것을 표시해줘야 한다.
t4 = (10)
type(t2) # tuple
type(t3) # tuple
type(t4) # int

이렇듯 다양한 생성 방법이 있고, t3와 t4의 차이에 유의하자.
t4는 튜플이 아니다.

참고

a1, a2, a3 = 1,2,3 # 각 변수에 1,2,3 각각 삽입. t2와의 차이점

2. 수정

t1[0] = 10    # 'tuple' object does not support item assignment
t1.append(11) # 'tuple' object has no attribute 'append'
del(t1[0])    # 'tuple' object doesn't support item deletion
del(t1)       # 가능

이렇듯 튜플은 수정이 거의 불가능한 읽기전용이므로
특정원소에 대한 수정 및 삭제가 되지 않는다.

딕셔너리

  • R에서의 리스트와 비슷
  • key - value 형식으로 저장하는 특징
  • Series, Dataframe의 기본 구조

1. 생성

d1 = {'a':1, 'b':2}
type(d1)             # dict
d2 = {'a':[1,2], 'b':[2,3]}

2. 색인

d1['a']     # [1,2]
d1.get('a')

[ 참고 - dict와 Series, DataFrame 관계 ]

from pandas import Series
from pandas import DataFrame
# pandas 모듈에서 불러올 수 있다.
Series(d1)    # 키값이 들어옴 : Series 역시 key value 구조임을 의미
DataFrame(d2) # "

Series([1,2,3])
DataFrame({'a':[1,2,3], 'b':[4,5,6]}) # Dataframe은 키전달 필수

3. 수정

d1['b'] = 22
d1['c'] = 3   # 키 기반이기 때문에 없는 키의 추가가 용이

4. 삭제

del(d1['c'])
d1['b'] = NA

#[ 참고 - R에서의 NULL, NA 표현식 대체 ]
from numpy import nan as NA

연습문제) 다음의 리스트와 딕셔너리를 참고하여 전화번호를 완성 : 02)345-4958

l1 = ['345-4958', '334-0948', '394-9050', '473-3853']
l2 = ['서울', '경기', '부산', '제주']

area_no = {'서울' : '02', '경기' : '031', '부산' : '051', '제주' : '064'} 

area_no['서울']   # '02'
f1 = lambda x : area_no[x]
area_no_number = list(map(f1, l2))
f2 = lambda x, y : x + y
area_num = list(map(f2, area_no_number, [')',')',')',')']))
list(map(f2, area_num, l1))

실습문제

좋아하는 음식 출력 프로그램

sol1 : while문에 종료 키값을 넣은 쿼리

food = {'food1' : ['떡볶이','짜장면','라면','피자','맥주','치킨','삼겹살'],
        'food2' : ['쿨피스','탕수육','김치','피클','육포','맥주','밥']}
v1 = ''
while v1 != '끝' :
    v1 = input("['떡볶이','짜장면','라면','피자','맥주','치킨','삼겹살'] 중 좋아하는 음식은? : ")
    if v1 in food.get('food1') :
        print('<%s> 궁합음식은 <%s>입니다.' % (v1, food.get('food2')[food.get('food1').index(v1)]))   
        if v1 == '떡볶이' :
            print('근데 %s는 음식이 아닙니다.' % v1)  
    elif v1 != '끝' : 
        print('그런 음식이 없습니다. 확인해보세요') 

sol2 : 딕셔너리와 break를 활용한 쿼리

d1 = {'치킨':'치킨무','라면':'김치','떡볶이':'어묵','짜장면':'단무지','피자':'콜라'}
flist = list(set(d1))
set(d1)

while 1 :
    ans = input(str(flist) + '중 좋아하는 음식은? ')
    if ans in flist :
        print('<%s> 궁합음식은 <%s>입니다.' % (ans, d1.get(ans)))
    elif ans == '끝' :
        print('프로그램 종료')
        break
    else :
        print('그런 음식이 없습니다. please check.')

실행 결과

 

불규칙한 리스트의 입력과 출력

sol1 : z를 입력하면 리스트 입력이 중단

i = 1
value = 1
outlist = []
while 1 :
    ans = input('%d 번째 생성할 리스트 수를 입력하세요 : ' % i)
    if ans == 'z' :
        break
    inlist = []
    for j in range(0, int(ans)):
        inlist.append(value)
        value = value +1
    outlist.append(inlist)
for i in outlist :
    for j in i :
        print('%2d' % j, end = ' ')
    print()
print('프로그램 종료')

 

계산기 프로그램 작성

: 1. 수식 계산 프로그램 2. 두 수 사이 합계인 두가지 기능 계산 프로그램

choice = input('1. 수식 계산 프로그램 \n2. 두 수 사이 합계 출력 프로그램\n 기능선택 : ')
if choice == '1' :
    ans = input('계산할 수식을 입력하세요 : ')
    res = eval(ans)
    print('%s 결과는 %d입니다.' % (ans, res))
if choice == '2' :
    num1 = int(input('첫 번째 숫자? : '))
    num2 = int(input('두 번째 숫자? : '))

    vsum =0
    for i in range(num1, num2 + 1) :
        vsum += i

    print('%d와 %d 사이 수의 합은 %d.' % (num1,num2,vsum))

 

모듈이름과 함수패턴 전달 시 매칭되는 함수명 출력

def 함수명 (인자1, 인자2, ...) :
    본문
    return 리턴 대상

위 형식으로 만들어보자.

import numpy
'zeros' in dir(numpy) # zero가 dir(numpy)라는 리스트의 원소입니까? (정확한 일치여부 - True)
'ze'    in dir(numpy) # False
'ze'    in 'zeros'    # True 문자열에 적용할 경우 True
def find_func(mname, fname) :
    flist = dir(mname)           # mname : module name
    for func in flist :
        if fname in func :
            outlist.append(func)
    return outlist

find_func(numpy,'na')
# numpy 모듈에 'na'가 들어간 함수 모두 출력

Comments