본문 바로가기
Python

Python 컬렉션 타입

by ma_ro 2020. 1. 25.

List & Tupple

List와 Tupple은 거의 동일.

List - mutable ( 생성 후에도 변경 가능 )

Tupple - immutable ( 생성 후에는 변경 불가 )

a = [ 1, 2, 3, 4 ] #List #[1, 2, 3, 4]
a = 'hello world'
b = list(a) #['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
c = (1, 2, 3) #Tupple
d = list(c) #[1, 2, 3]

다른 타입으로 부터 list 생성도 가능하다.

 

str 과 list

a = 'hello world'
#a[0] = 'j'
#TypeError: 'str' object does not support item assignment

b = list(a)
b[0] = 'j'
#['j', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

list값은 mutable이기 때문에 변경 가능하다.

str은 immutable이기 때문에 변경 불가하다. 다른 str을 만들고 싶다면 새로 객체를 생성해야함.

b = 'jello wolrd'
c = 'j' + a[1:]
d = a.replace('h', 'j')
print(a) #hello world

 

slincing 지원

a = [1, 2, 3, 4, 5, 6, 7]
a[:4] #[1, 2, 3, 4]
a[:7:2] #[1, 3, 5, 7]
# start:end:increment

 

append(), extent(), insert()

a = [1, 2, 3, 4, 5, 6 ]
b = [9, 10]
a.append(8) #[1, 2, 3, 4, 5, 6, 8] # 값 추가
a.extend(b) #[1, 2, 3, 4, 5, 6, 8, 9, 10] # list 연장 # a += b 로도 가능
a.insert(6, 7) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # index, 값 # 원하는 위치에 값 추가

 

remove(), pop()

a = [1, 2, 3, 4, 5, 6 ]
a.remove(3) #[1, 2, 4, 5, 6] #값 지정 삭제
a.pop() #[1, 2, 4, 5] #마지막값 삭제
a.pop(3) #[1, 2, 4] #index 지정 삭제

 

index(), in 키워드

a = [1, 2, 3, 4, 5, 6, 7 ]
print(a.index(2)) #1 #요청값의 index 반환
print(3 in a) #True #값이 있는지 확인

 

sort(), sorted()

a = [5, 45, 1, 8, 84, 24 ]
a.sort(reverse=True) #멤버함수 #[84, 45, 24, 8, 5, 1]
b = sorted(a) #내장함수 #[1, 5, 8, 24, 45, 84]

sort() = list의 멤버함수. list자체를 내부적으로 정렬.

sorted() = python 내장함수. list의 정렬된 복사본을 반환

 

Tupple unpacking

a = 100, 200
print(type(a)) #tupple

a = ( 100, 200 ) 이렇게 써야하나 ()를 생략해도 인식한다. 

 

a, b = 10, 20
print(type(a)) #int

여러 개의 변수 선언이 가능한데 이때 type은 당연히 tupple이 아니다. 

이 과정에서 packingunpacking이 일어난다. 

10, 20을 packing하여 컬렉션으로 묶는다. 

이것을 변수에 각각 대입하는데 이것이 unpacking이다. 

 

Dictionary

대응 관계를 나타낼 수 있는 자료형.

이를 연관 배열(Associative array) 또는 해시(Hash)라고 한다.

 dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

 

추가

dic['city'] = 'seoul'

키값과 벨류값을 넣어 준다. 값이 이미 존재할 경우 overwrite 된다.

 

삭제

dic.pop('phone')
del dic['phone']

pop함수를 사용한다. del 명령어와 키값을 지정해준다. 

 

주의사항

Key에 리스트는 쓸 수 없다. 하지만 튜플은 Key로 쓸 수 있다. 딕셔너리의 Key로 쓸 수 있느냐 없느냐는 Key가 변하는 값인지 변하지 않는 값인지에 달려 있다. 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없다. 다음 예처럼 리스트를 Key로 설정하면 리스트를 키 값으로 사용할 수 없다는 오류가 발생한다

 

update()

a = { 'a':1, 'b':2, 'c':3 }
b = { 'a':2, 'b':3, 'd':8}
a.update(b) #{'a': 2, 'b': 3, 'c': 3, 'd': 8}

두 dictionary를 병합한다. 중복값이 있으면 overwrite 된다.

 

dic.keys(), dic.values(), dic.items()

dic.keys()
dict_keys(['name', 'phone', 'birth']) #key값들을 모아서 dict_keys 객체를 반환

dic.values() 
dict_values(['pey', '0119993323', '1118']) #value값들을 모아서 dict_values 객체를 반환

a.items() #key와 value 쌍을 반환
dict_items([('name', 'pey'), ('phone', '0119993323'), ('birth', '1118')])

 

[파이썬 3.0 이후 버전의 keys 함수, 어떻게 달라졌나?]

파이썬 2.7 버전까지는 dic.keys() 함수를 호출할 때 반환 값으로 dict_keys가 아닌 리스트를 돌려준다. 리스트를 돌려주기 위해서는 메모리 낭비가 발생하는데 파이썬 3.0 이후 버전에서는 이러한 메모리 낭비를 줄이기 위해 dict_keys 객체를 돌려준다. 만약 3.0 이후 버전에서 반환 값으로 리스트가 필요한 경우에는 list(a.keys())를 사용하면 된다. dict_keys, dict_values, dict_items 등은 리스트로 변환하지 않더라도 기본적인 반복(iterate) 구문(예: for문)을 실행할 수 있다. 리스트 고유의 append, insert, pop, remove, sort 함수는 수행할 수 없다.

 

dic.clear()

dic.clear() #안의 key값과 value값을 모두 삭제

 

dic.get('key')

dic.get('name') #'pey'
dic.get('color') #None
dic.get('color', 'red') #'red'

dic.get('name')은 dic['name']을 사용했을 때와 동일한 결괏값을 돌려받는다.

다만 다음 예제에서 볼 수 있듯이 dic['color']처럼 존재하지 않는 키(nokey)로 값을 가져오려고 할 경우 dic['color']는 Key 오류를 발생시키고 dic.get('color')는 None을 돌려준다는 차이가 있다. 또한 디폴트 값을 지정해줄 수도 있다.

 

key값 in Dict

'name' in dic #True

dic 안에 값이 있는지 확인

 

set

집합과 비슷한 의미. dictionary처럼 {}를 사용하며 순서가 없다.

key값만 지정하며, 값은 중복되지 않는다. 

set = { 1, 1, 2, 1, 3, 2, 4 } #{1, 2, 3, 4}

list에서 set으로 변환 가능하다.

list_l = [ 1, 1, 2, 1, 3, 2, 4 ] #[1, 1, 2, 1, 3, 2, 4]
set_s = set(list_l) #{1, 2, 3, 4}

수학의 집합개념을 사용할 수 있다.

a = {1, 2, 3}
b = {3, 4, 5}

print(a.union(b)) #합집합
print(a.intersection(b)) #교집합
print(a.difference(b)) #차집합
print(a.issubset(b)) #부분집합 #리턴값 boolean

{1, 2, 3, 4, 5}
{3}
{1, 2}
False

'Python' 카테고리의 다른 글

Python requests 모듈  (0) 2020.01.25
Python 조건문, 반복문  (0) 2020.01.23
Python Output Formatting  (0) 2020.01.22
Python 기본 데이터 타입  (0) 2020.01.21
if __name__ == '__main__': 의 의미?  (0) 2020.01.19

댓글