AI데이터 분석_ 파이썬 기초7_튜플,세트,딕셔너리(의 값수정, 메소드, 함수, 집합연산,실습)

2024. 9. 8. 10:45파이썬을 활용한 데이터 분석

튜플의 요소 값 수정하기

#튜플의 요소 접근하기
tu1=(10,20,30,10,10,'a','b')
print(tu1[0],type(tu1[0]))
print(tu1[:4],type(tu1[:4]))

#튜플의 요소 수정
# tu1[0]=12 #튜플은 수정이 불가함!
# print(tu1)

#튜플을 수정하기위해서는 튜플을 다른 자료형으로 형변환 해주어함
#tuple => list
tu1=list(tu1)
print(tu1,type(tu1)) #튜플에 대한 요소는 그대로 가지면서 자료형이 리스트로 변환!

tu1[0]=100 #리스트는 변경이 가능하기때문에 인덱스로 요소 수정가능!
print(tu1)

tu1=tuple(tu1)
print(tu1,type(tu1)) #리스트로 형변환 한 후에 값을 수정하고 다시 tuple()함수를 이용하여
#tuple로 변환하면 튜플의 값을 수정할 수 있음!

튜플의 요소값에 접근하기 위해서는 리스트처럼 인덱스 번호를 사용하여 요소값에 접근한다. 하지만 리스트와 다른점은 튜플은 수정이 불가하다는 점이다. 만약 이미 생성해둔 튜플을 수정한다고 리스트와 동일하게 튜플[인덱스번호]=값의 형태를 사용했다면 에러가 발생한다. 그렇기때문에 튜플을 수정할때는 리스트로 형변환을 해준 후, 값을 수정 한 후에 다시 튜플로 형변환을 시켜주는 작업을 거쳐야만 튜플의 수정이 가능하다.

 

튜플의 메소드

#튜플의 메소드

tu=(1,2,3,4,5,1,2,4,1,2,3,1,2)
print(tu,type(tu))
print(tu.count(1)) #count(값): 튜플안에 해당값이 몇개나 있는지 갯수로 보여줌
print(tu.index(3),type(tu.index(3))) #index안에 있는 해당 값이 객체안에서 인덱스 몇번에 위치에 있는건지 반환해줌
print(tu.index(3),type(tu.index(3))) #두번출력해도 맨 처음거 출력
print(tu.index(1,5,10))
#index 메소드 사용할때 안에 값을 3개를 입력하게되면
#(찾을값, 시작할 인덱스, 종료할 인덱스)로 해당 찾을 값의 범위를 한정
print(tu.index(3,2,7))


#튜플에서 append / insert / remove, pop / sort 사용불가!!!
#튜플에서 값은 수정이 안되는데 append와 insert,remove,pop은 값을 추가 및 삭제 하여 수정하는 것이기때문에
#튜플에서 사용이 불가함. 'tuple' object has no attribute 'insert'
#튜플에서 값을 추가하고싶다면 리스트로 형변환 한 후에 값 추가하기!
del tu #del은 사용가능함. 튜플의 요소를 삭제하는것은 수정에 해당하지만 튜플자체삭제는 해당이 안되기때문

실무에서 가장많이 사용하는 대표적인 튜플의 메소드에는 count와 index가 있다. count는 튜플명.count(해당값)의 형태로 사용하며, 메소드안에 전달된 값이 해당 튜플안에 몇개나 있는지 개수로 보여주는 메소드이다. index는 튜플명.index(해당값)의 형태로 사용하며, 메소드안에 전달된 해당 값의 인덱스번호 위치를 반환한다. 만약 튜플안에 중복값이 있다면 인덱스번호 순서상 가장 첫번째로 등장한 값의 인덱스 번호롤 반환해준다. 또한 리스트에서 사용했던 메소드들은 당연히 튜플에서 사용할 수 없다. 리스트의 메소드들은 대부분 값을 수정하는 기능을 하기때문이다.

 

튜플의 함수

#튜플의 함수
tu=(1,2,3,4,5,1,2,4,1,2,3,1,2)
print(f"tu의 길이:{len(tu)}")
print(f"tu의 최대값:{max(tu)}")
print(f"tu의 최소값:{min(tu)}")
print(f"tu의 합계:{sum(tu)}")
print(f"tu의 평균:{sum(tu)/len(tu)}")

#튜플의 함수는 리스트와 동일하게 사용가능

튜플 함수의 경우 리스트와 동일하게 사용이 가능하다.

 


 

세트의 메소드

세트의 값 추가하기 (add)

#세트의 메소드
set1 = {'사과','참외','파인애플','멜론'}
print(set1,type(set1))

#값 추가하기 .add
set1.add('포도')
print(set1,type(set1)) #추가되는 순서는 상관없음. 그냥 포도라는 값이 추가가되면 됨
set1.add('딸기')
print(set1)
set1.add('포도') #이미 포도가 있는데 추가한다고 해서 에러나지 않음. 코드무시

세트에 값을 추가하고싶을때는 add()메소드를 사용한다. 세트명.add(추가할 값)의 형태로 작성한다. 세트의 경우 시퀀스자료형이 아니기때문에 당연히 정해진 순서가 없어, 추가값이 위치상관없이 추가된다.

 

세트의 값 삭제하기 (remove, discard, pop)

#값 삭제하기 .remove() / discard() / pop()
set1.remove('포도')
print(set1) #포도 삭제
# set1.remove('수박') #수박은 삭제가 되지 않고 에러가남. 세트에 수박이라는 값이 없기때문

set1.discard('수박') #세트에 없는 값을 입력해도 에러가 나지않음
print(set1) #코드무시가 되어 출력 됨

set1.pop()
print(set1) #아무값이나 1개 삭제가 됨
set1.pop()
print(set1)

# set2={'만두', '피자', '치즈', '김치'}
# set1.extend(set2)
#set에서 extend 사용 불가

세트의 요소값을 삭제하고싶을떄는 remove, discard, pop을 사용한다. 먼저 remove는 세트명.remove(삭제할값)의 형태로 작성하는데, 만약 세트안에 삭제할 값이 없다면 에러가발생한다. discard의 경우, remove와 동일한 방식으로 사용하는데, 세트에 없는 값을 입력해도 에러가 나지 않는다. pop()의 경우 아무값이나 세트안에서 삭제되어 출력된다.

 

세트의 집합연산

#세트의 집합연산

#세트는 다른 컬렉션들과는 다르게 집합연산이 가능함

se1 = {1,2,3,4,5}
se2 = {3,4,5,6,7}

#교집합
#intersection  &
print(se1 & se2,type(se1 & se2))
se1.intersection(se2)
print(se1.intersection(se2)) #print()문 안에서도 바로 사용가능

#합집합
#union  |
print(se1.union(se2)) #중복값이 제외된 다음 합집합으로 합쳐짐
se1.union(se2)
print(se1 | se2)

#차집합
#difference  -
print(se1 - se2) #se1기준에서 se2에 없는 값을 찾아주는것
#때문에 차집합은 앞뒤에 어떤 세트를 먼저 적느냐에 따라 값이 달라질 수 있음
print(se1.difference(se2))

print(se2 - se1)
print(se2.difference(se1))

세트는 다른 컬렉션들과는 다르게 집합연산이 가능하다. 교집합은 intersection으로 작성하며 연산자로는 &를 사용한다. 교집합은 두 세트안에서 완전히 교집되는 값들만 출력된다. 합집합은 union으로 작성하며 연산자는 |으로 작성한다. 합집합의 경우 중복값이 제외된 다음 합집합으로합쳐진다. 차집합은 difference이며 연산자는 -로 작성한다. 차집합의 경우 다른 집합연산와는 다르게 적는 순서가 중요한데, A difference B의 일때는 A기준에서 B에게 없는값을 출력하고, B difference A의 경우에는 B기준으로 A에게 없는 값을 찾는것이기때문에 앞뒤에 어떤 세트를 먼저 적느냐에따라 값이 달라질 수 있기때문에 주의해야한다.

 

 


딕셔너리의 값 수정

#딕셔너리
cities = {'korea':'한국','japen':'일본','china':'중국'}
print(cities,type(cities))

#비어있는 딕셔너리 생성
di = {}
di2 = dict()
print(di,type(di))
print(di2,type(di2))

#딕셔너리의 값 수정
#딕셔너리명[key]=value
cities['japen']='Tokyo'
print(cities,type(cities)) #원래 일본이었던 japen의 value가 Tokyo로 변경되어서 출력

딕셔너리의 값을 수정하고싶을때는 딕셔너리명[키]=새로운값의 형태로 키값에 접근한 후 값을 수정해야하며, 딕셔너리에 새로운 값을 추가할때도 딕셔너리명[새로운키]=새로운값의 형태로 값을 추가한다.

 

딕셔너리의 메소드

딕셔너리 값 삭제(pop, clear)

#key value삭제
#.pop(key값)
cities.pop('japen')
print(cities) #japen과 일본삭제되어 출력
print(f"삭제할 값: {cities.pop('china')}")
print(cities) #중국과 일본 없어지고 한국과 베를린만 남음

#딕셔너리에 저장된모든 데이터 제거
cities.clear()
print(cities) #요소 전부 삭제되어 비어있는 딕셔너리로 출력됨

딕셔너리의 값을 삭제할 때에서는 pop을 사용한다. 딕셔너리명.pop(키값)의 형태로 사용하며 pop안에 적힌 키값의 벨류까지 한쌍으로 삭제된다. 이렇게 요소하나하나 삭제하지 않고 딕셔너리에 저장된 모든 데이터를 제거하고싶다면 clear메소드를 사용해야한다. 딕셔너리명.clesr()의 형태로 사용하며, 모든 값이 삭제되어 빈 딕셔너리의 형태로 출력된다.

 

key값만 출력하기(keys)

#딕셔너리의 메소드

cities = {'korea':'서울','japan':'일본','china':'중국','germany': '베를린'}
print(cities,type(cities))

#.keys(): 딕셔너리의 key값만 모아놓은 컬렉션을 만들어줌
print(cities.keys(),type(cities.keys())) #w자료형은 dict_keys이고 키값만 있는 컬렉션이 출력
print(list(cities.keys()),type(list(cities.keys()))) #키값들만 드러있는 값을 리스트로 형변환 하여 리스트로 만들어줌

for i in cities.keys():
  print(i) #키값만 모인 집합(리스트)을 for반복문의 집합형태로사용

딕셔너리에서 key값만 모아서 출력하고싶을때는 keys()메소드를 사용하며, 딕셔너리명.keys()의 형태로 작성한다. 이렇게 작성하게되면 딕셔너리안에서 value값이 제외된채 오로지 키값만있는 컬렉션출력되며, 반복문을 사용할경우 집합안에있는 키값들을 하나씩 꺼내서 출력할 수 있다. 

 

value값만 출력하기(values)

#.values(): 딕셔너리의 values값만 모아놓은 컬렉션을 만들어줌
print(cities.values(),type(cities.values))#자료형은 dict_valeus이고 벨류값만 있는 컬렉션이 출력
print(list(cities.values()),type(list(cities.values()))) #벨류값만 리스트로 만들어서 출력

for i in cities.values():
  print(i) #벨류값만 모아놓은 리스트값을 for 반복문의 집합으로 사용

딕셔너리의 value값만 출력하고싶을때는 values메소드를 사용해야하며, 딕셔너리명.values()의형태로 사용한다. key값만 출력할때와 마찬가지로 반복문을 사용하면 value의 값들을 하나씩 꺼내 출력할 수 있다.

 

key값과 value값 튜플로 출력하기(items)

#.items() : 키값과 벨류값을 하나의 튜플로묶어서 출력해줌
print(cities.items(),type(cities.items())) #키와 벨류값이 괄호로 묶여서 하나의 튜플로 출력됨

for i in list(cities.items()):
  print(i,type(i)) #값이 튜플로 반복되어서 나옴

for key, value in list(cities.items()):
  print(f"영문:{key}  한글:{value}") #튜플의 언패킹을 사용하여 딕셔너리의 items()값을
#각각 변수안에 넣어줌

print(key,value) #반복문 사용 후 변수로 출력해보면 반복문에서 맨 마지막으로 반복됐던
#germany와 베를린이 출력됨

items메소드는 딕셔너리의 key와 value값을 튜플로 묶어서출력하는 메소드이다. 그렇기때문에 주로 반복문을 사용하여 튜플의 언패킹방식으로 값을 출력하는 경우가 많다. 

 

key값으로 value값 검색하기

#.get()
#딕셔너리명.get(key값)입력하면 key값이 가진 value값을 반환해줌

di1={'봄':'꽃', '여름': '수박', '가을': '단풍', '겨울':'눈사람'}
print(di1,type(di1))

print(di1.get('봄'),type(di1.get('봄')))

딕셔너리에서 get메소드를 사용하면 key로 value값을 검색해 출력하는 것과 같은 역할을 한다. get의 괄호안에 key값을 입력하면 그 key값에 해당하는 value값을 출력해준다.

 

 

 

전체 컬렉션의 메소드  활용 실습

#<실습>
#빈 리스트를 생성하고 for문을 사용하여 1~10까지 추가하기

#<로직구성>
#1)리스트 함수를 활용하여 리스트 생성
#2)for문과 range를활용하여 1~10까지의 숫자가 반복출력되도록 설계
#3)리스트 메소드 .append를 사용하여 반복된 값 리스트안에 추가


li1 = list()

for num in range(1,11):
  li1.append(num)  #꼭 여기서 결과를 출력할 필요는 없음.

print(li1)

print()

li2 = []

for num1 in range(1,11):
  li2.append(num1)
  print(li2)  #출력할때마다 쌓이는 누적 반복을 보고싶다면 출력된 최종결과를 볼 수 있도록
  #for문 안에 출력값을 넣으면 반복되면서 누적 출력값을 볼 수 있음

#<실습>
#음료자판기 프로그램 만들기
#버튼1 콜라, 2번 사이다, 3번 환타이고
#각 버튼에 따라 음료수 이름 출력하고
#그외 버튼이 입력될떄는 '제공하지 않은 메뉴'를 출력하기

#<로직구성>
#1) 음료자판기의 버튼을 key값으로, 음료의 이름을 value값으로 지정한 딕셔너리를 생성
#2) 계속해서 음료를 입력받아야하고, '그외의 버튼이 입력될때'라는 조건이 있기때문에 무한루프를 사용하고 if조건문을 활용
#3) 음료수 이름을 입력해야하기 때문에 input함수를 만들어줌

drink = {1:'콜라', 2:'사이다', 3:'환타'}

while True:
  name = int(input('음료의 번호를 입력하세요(1~3): '))
  if name in drink:
    print(drink[name])
    # print(drink.get(name)) 으로 get함수사용해서 출력해도 됨!
    break
  else:
    print('제공하지않은 메뉴')

 


학습일기

사실 리스트나 튜플의 메소드는 거의 까먹은게 없었는데..딕셔너리의 경우 items활용법이 생각이 안나서 복습하는김에 실습문제도 왕창풀어줬다..이제 안까먹겠지..기초를 다시 복습할때마다 이렇게 중간중간 익숙치않은 것들이 나올때마다 사용하는거 이외에 이걸가지고 어떻게 활용해야하는지가 기억이 안날때가 많다...자괴감도 들기도 하지만..그냥 모르고 지나가는것보다는 훨씬 나으니까..! 어제의 나보다 성장했으면 된거다..!!