AI데이터 분석_ 파이썬 기초4(컬렉션 종류, 리스트, 튜플, 세트, 딕셔너리)

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

파이썬의 컬렉션

파이썬에는 컬렉션이라는 것이 존재한다. 컬렉션이란 정수, 실수, 문자열등과 같은 데이터 타입과 달리 여러가지 값을 하나로 묶어서 사용하는 자료형이다.

 

컬렉션 종류

  • 리스트
  • 튜플
  • 딕셔너리
  • 세트

 

리스트(list)\

#컬렉션
"""정수, 실수, 문자열 등 하나로 정해져있는 데이터 타입과는 달리,
여러가지 데이터타입을 묶어서 사용할 수 있는 형태"""

#list

#1)[]대괄호 사용하며 중복값이 허용된다
#2)모든 자료형이 들어간다 = 리스트안에 리스트도 들어갈 수 있음
li1 = [1,2,3,1,2,3]
print(li1) #중복값허용
li1=[1,2,3,1,2,3,"안녕!",20.1,True,[4,5,6]]
print(li1)#문자, 실수, 논리, 리스트까지 리스트안에 전부 들어갈 수 있음

#3) list는 시퀀스 자료형
#리스트는 시퀀스 자료형이기때문에 indexing과 slicing이 가능함
#[indexing]
li2=[1,2,5,345,74,3]
print(li2[0],li2[5],li2[3]) #인덱싱 가능
print(li2[0],type(li2[0])) #리스트안에 저장되어있는 자료형으로 출력됨 'int'
print(li2[0]+li2[5]+li2[3]) #리스트안에 저장된 값이 int이기때문에 +하면 덧셈가능
print(li1[6],type(li1[6])) #문자형이기때문에 자료형 str
print(li1[7],type(li1[7])) #실수형이기때문에 자료형 float
print(li1[8],type(li1[8])) #논리형이기때문에 자료형 bool

#[silcing]
print(li2[0:3]) #슬라이싱 가능
print(li2[0:4],type(li2[0:4])) #슬라이싱 한경우 자료형은 list로 출력
"""인덱싱은 '추출'하는것 이기때문에 하나의 자료형으로 출력이되지만
슬라이싱은 '자르는것'. 큰 빵덩어리를 자른다고 빵이 아닌게 아니기때문에
슬라이싱으로 리스트를 출력한 경우에는 자료형은 리스트로 출력됨"""
print(li2[0:1],type(li2[0:1])) #슬라이싱으로 한개만 가져오더라도 자료형은 리스트임

#이중 list / 2차원 리스트
li3 = [1,2,3,['1','2','3']]
print(li3,type(li3))
print(li3[0],type(li3[0])) #인덱싱 한것이기때문에 int의 자료형으로 출력
print(li3[3],type(li3[3])) #2차원 리스트는 리스트의 한 덩어리로 인덱스번호를 가짐
#애초에 만들어진 자료가 리스트이기때문에 자료형을 뽑아도 리스트라고 추출
print(li3[3][1],type(li3[3][1]))#2차원 리스트안에 있는 자료값을 뽑을때는 리스트인덱스번호를
#먼저 적어준 후 쉼표없이 그 옆에 바로 2차원리스트의 기준 인덱스번호를 입력한다!

#이중 리스트 자료추출 실습>
li4 = [1,2,3,['안녕','반가워']]
print(li4[3][0][0],type(li4[3][0][0]))
#이중리스트에 저장된 자료값에서도 한글자만 추출하고싶다면
#이중리스트번호 -> 이중리스트의 자료값번호-> 이중 리스트의 자료값번호의 인덱스번호


# 컬렉션에서 사용할 수 있는 in, not in연산자
# a in 컬렉션 => a라는 값이 컬렉션 안에 있어?
# a not in => a라는 값이 컬렉션 안에 없어?

print(1 in li4) #리스트안에 1이 있기때문에 컴퓨터가 '응!' 있어! 라고 대답 = (True)
print(100 in li4) #리스트안에 100이 없기때문에 컴퓨터가 '아니!' 없어! 대답 =(False)
print(1 not in li4) #리스트안에 1이 있는데 없냐고 물어봐서 컴퓨터가 '아니!' 있어!= (False)
print(100 not in li4) #리스트안에 100이 없는 없냐고 물어봐서 컴퓨터가 '응!' 없어! 라고 대답=(True)


#리스트에서 사용하는 시퀀스 연산자
#리스트도 시퀀스 연산자이기때문에 시퀀스 연산자의 사용이 가능하다
li5 = [1,2,3]
li6 =[4,5,6]

print(li5+li6,type(li5+li6))#리스트와 리스트를 합쳐준 것이기때문에 하나의 리스안에 리스트의값이 모두 들어간다
print(li5*3,type(li5*3))
print(li5[0]+li6[0],type(li5[0]+li6[0]))
#리스트에서 숫자형 자료형을 인덱스해서 추출해서 연산하면 연산 가능!

리스트는 []대괄호를 사용하여 값을 묶어주고 콤마로 값을 구분하는 묶음 자료형이다. 리스트의 경우 중복값을 허용하기때문에 같은 값이 들어갈 수 있다. 리스트는 시퀀스 자로형으로 인덱스번호를 가질 수 있다. 리스트는 중복값 뿐만아니라 모든 자료형을 포함하기때문에 리스트안에 리스트도 들어갈 수 있으며, 추가, 수정, 삭제가 언제든 가능한 자료형이다.

 

 

튜플(tuple)

#튜플(tuple)
#리스트와 거의 동일하지만 한번 생성하면 수정이 불가능 ->읽기전용 리스트라고도 불림

tu1=(1,2,3,'안녕',True,1.1) #모든 자료형 삽입가능, 중복값도 허용!
print(tu1,type(tu1))

#시퀀스 자료형_인덱싱 / 슬라이싱 둘다 가능
#인덱싱
print(tu1[3],type(tu1[3])) #'안녕'추출! 인덱싱이기때문에 문자형으로 추출
print(tu1[4],type(tu1[4])) #4번째인 논리형으로 추출

#슬라이싱
print(tu1[0:3],type(tu1[0:3])) #슬라이싱 했기때문에 자료형은 tulple

#튜플의 특징_packing(패킹)/unpacking(언패킹)
#packing(패킹) : 여러가지 자료형을 튜플로 묶어주는것!
tu2= 1,2,3,1,2,3,'패킹'
print(tu2,type(tu2)) #소괄호를 사용하지 않아도 소괄호로 묶여출력되며 자료형도 튜플!
tu3=1
print(tu3,type(tu3))#튜플의 값이 한개일때 그냥 tu3이라는 변수에 그 한개의 값을 넣어준 것이기때문에 tu3의 자료형은 int임 튜플이 아님
tu3 = 1,
print(tu3,type(tu3)) #패킹할때 값이 하나이더라도 뒤에 콤마를 작성해야 튜플로 패킹됨
tu3= (1,)
print(tu3,type(tu3)) #일반 튜플 생성할때도 똑같이 값이 하나라면 콤마 무조건 작성

#unpacking(언패킹):튜플의 요소를 여러개의 변수에 할당
print(tu2,type(tu2))#7개의 값이 들어가 있음
num1,num2,num3, num4,num5,num6,num7= tu2
print(num1,type(num1)) #패킹되어있던 값들을 풀어서 해당 변수에 순서대로 넣어줌
print(num7,type(num7))
#unpacking된 값은 본래가지고있던 기본 자료형으로 출력
#*unpacking할때 값의 갯수와 변수의 갯수가 동일해야함. 그러지 않으면 오류!*

#in, not in연산자 사용
#튜플에서도 in not in연산자 사용이 가능함
print(1 in tu2,type( 1in tu2))#1이라는 값이 tu2안에 있니? => 있어!(True)로 출력하기 때문에 자료형은 논리형
print(2 not in tu2)

#시퀀스 연산자 사용
#튜플은 시퀀스 자료형이기때문에 시퀀스 연산자 사용가능 (+,*)
print(tu1+tu2,type(tu1+tu2)) #튜플2개의 값이 하나의 튜플로 연결되었고 자료형도 튜플로 출력
print(len(tu1+tu2),type(len(tu1+tu2))) #len로 값 갯수 출력하면 두개의 값이 합쳐져서 13출력
print(tu1*2,type(tu1)) #두번반복되고 결과 튜플

튜플은 ()소괄호를 사용하여 값을 묶어주고 콤마로 값들을 구분하는 묶음 자료형이다. 튜플역시 리스트와 동일하게 모든 자료형을 허용하며, 중복값역시 허용하기때문에 튜플안에 튜플도 들어갈 수 있으며, 리스트와 마찬가지로 시퀀스자료으로 인덱스번호를 가진다. 하지만 튜플은 리스트와 다르게 한번 생성되고 나면 변경이 불가능하기때문에 읽기 전용 리스트라고도 불린다.

 

 

딕셔너리(dict)

#딕셔너리(dict)
# key : value의 형태
#비시퀀스 자료형이므로 인덱싱, 슬라이싱 불가
#하지만 key를 인덱스 번호처럼 사용할 수 있음 => key는 중복 X value는 중복 가능하며 어떤 자료형도 다 들어갈 수 있음

di1 ={"A":1, "B":2}
print(di1,type(di1)) #자료형 딕셔너리

di2={"A점":["짱구","철수","유리","훈이"],"B점":"맹구" }
print(di2,type(di2))#"A점"안에 리스트를 활용하여 여러가지의 값 넣기 가능

#key로 value접근하기
#딕셔너리명[key]
print(di2["A점"],type(di2["A점"]))#"A"점에 저장된 값이 나오고 자료형은 리스트
print(di2["B점"],type(di2["B점"])) #"B"점에 저장된 맹구가 나오고 자료형은 문자형

#keys() , values()
#딕셔너리의 key값만 추출하기
print(di2.keys,(),type(di2.keys())) #딕셔너리명.keys #key값인 A점과 B점만 나옴. 자료값은 딕셔너리의 키값!
#딕셔너리의 value값만 추출하기
print(di2.values(),type(di2.values()))#딕셔너리명.values() #values값인 이름들이 나옴. 자료값은 딕셔너리의 벨류값!

#딕셔너리의 튜플. =>> items
print(di2.items(),type(di2.items()))# 딕셔너리의 키와 벨류를 하나의 튜플로 묶어서 출력

딕셔너리는 key와 value가 한쌍으로 관리되며, 비 시퀀스 자료형이다. key는 key를 검색해서 값을 찾기때문에 중복값을 허용하지 않지만 value는 중복값을 허용한다. key는 인덱스 번호와 비슷한 역할을 하며, 기본 자료형만 들어올 수 있음. value는 문자열 정수, 실수, 리스트, 튜플 딕셔너리 등등 전부 들어올 수 있다.

 

세트(set)

#세트{set}
#세트는 중복값을 가질 수 없음. 비시퀀스 자료형(시퀀지연산자 사용X  인덱스, 슬라이싱 사용X)

set1 = {1,2,3,1,2,3}
print(set1)#중복값을 넣는다고 해서 오류가 나는것은 아니지만 출력할때 중복값 제외하고 출력
# print(set1[1])#인덱스 사용불가!
# print(set1*2)#시퀀스 연산자 사용불가!


#컬렉션의 형변환_중복제거 set
#컬렉션 형변환 할때 set를 사용하면 리스트와 튜플의 중복값을 제거하여 set로 만들 수 있다
#set() =>>set로 형변환해주는 함수
li1 = [1,2,3,1,2,3]
print(set(li1),type(set(li1)))#기존 리스트에서 중복값이 제거되었고 자료형도 세트로 형변환
li2=[1,2,3,1,2,3,'안녕','안녕']
print(set(li2),type(set(li2))) #변수 안쓰고 print문에서 바로 형변환 가능

#list()=>> list로 형변환해주는 함수
set2 = set(li1)
print(set2,type(set2)) #현재 세트로 형변환되었기때문에 세트로 출력!
li2= list(set2)
print(li2,type(li2)) #리스트로 다시 형변환이 되었음

#tuple()=>>tuple로 형변환해주는 함수
tu1= 1,2,3,4,1,2,3 #패킹으로 tuple만들기
print(tu1,type(tu1)) #자료형 튜플
set3 = set(tu1)
print(set3,type(set3)) #중복값 제거되고 자료형 세트로 출력
tu1 = tuple(set3)
print(tu1,type(tu1)) #세트였던 set3을 다시 tu1이라는 변수안에 튜플로 형변환하여 다시 튜플로 출력됨

#세트는 비시퀀스이기때문에 순서가 뒤죽박죽 출력될 수 있음
set4= {1,2,3,"안녕",True, 1.0,1.1}
print(set4) #"안녕"이 제일 끝으로감. 세트는 1이나 1.0이나 같다고 판단되기때문에 1.0이 중복값으로 체크되어 사라짐

세트는 {}중괄호로 값을 묶어주고 콤마로 값들을 구분한다. 중복값을 허용하지 않으며, 비시퀀스 자료형이다. 세트에는 인덱스라는 개념이 없기때문에 순서의 개념이 없으며 마찬가지로 인덱스 번호를 사용하지 않는다. 따라서 세트의 경우 세트에 입력된 값들의 순서가 아닌 랜덤순서로 출력되는 경우가 있다. 세트의 경우 만들때 중복값을 넣을 수는있지만 출력하면 중복값이 없어진채로 출력된다. 

 

비어있는 컬렉션 만들기

#비어있는 컬렉션 생성하기

#1)비어있는 리스트만들기 : (1):빈 대괄호 사용[]  / (2)list()함수 사용하기
li1 = []
print(li1,type(li1)) #값이 비어있는 리스트 출력
print(bool(li1),type(bool(li1))) #bool자료형에서 빈값들은 전부 False반환하기때문에 bool자료형으로 변환하면 False출력
li2=list()
print(li2,type(li2)) #리스트 함수를 이용하여 만든 값이 비어있는 리스트
# li3 = list(1,2,3,4)
# print(li3)#에러발생. list()함수는 비어있는 리스트를 생성하거나 리스트로 형변환을 할때만 사용

#2)비어있는 튜플만들기: (2)빈 소괄호 사용() /tuple()함수 사용하기
tu1 = ()
print(tu1,type(tu1)) #값이 비어있는 튜플 출력
print(bool(tu1),type(bool(tu1))) #튜플도 bool함수로 변환하면 빈괄호 이기때문에 False출력
tu2=tuple()
print(tu2,type(tu2)) #tuple함수를 사용하여 빈 튜플 만들기
# tu3 = tuple(1,2,3)
# print(tu3,type(tu3)) #튜플도 tuple함수를 이용하여 튜플생성X

#3)비어있는 세트 만들기 : set()함수 이용하기
set1 = {}
print(set1,type(set1)) #자료형 dict으로 나옴. 세트는 빈중괄호 사용해서 빈 세트 못 만듬!
set2=set()
print(set2,type(set2)) #set()함수를 이용하면 빈 세트 만들기 가능!
#※set는 {}중괄호만을 이용하여 빈 세트 못만듬. 오로지 set()함수만 이용하기※#

#4)비어있는 딕셔너리만들기 : (1)빈 중괄호사용 {} / dict()함수 사용하기
di1={}
print(di1,type(di1)) #빈 중괄호 사용해서 비어있는 딕셔너리 만들기
di2 = dict()
print(di2,type(di2)) #dict()함수를 이용하여 비어있는 딕셔너리만들기

비어있는 컬렉션을 만들려면 각각의 컬렉션 함수를 만들거나 괄호를 사용해서 만들수 있다. 단 주의할점은 세트의 경우 {}괄호로만들경우 딕셔너리로 만들어지기때문에 세트만 세트의 함수를 사용하여 빈 세트를 만들어야한다.

 


 

학습일기

오..이제 파이썬의 컬렉션까지 왔다..! 컬렉션도 너무 기초적인 부분이라 개념 자체는 어렵지 않지만 메소드와 함께 사용되고 활용적인 부분으로 넘어가면서부터 갑자기 난이도가 확뛰기때문에 컬렉션도 개념을 이해하는것도 중요하지만 계속 사용하고 연습해서 활용을 제대로 하는것이 중요한것 같다..!