리스트, 딕셔너리, 튜플, 세트
리스트 [a, b, ...]
리스트는 객체의 집합으로, 순서를 가지고 있다.
subway = [10, 20 ,30]
subway = ['유재석', '조세호', '박명수']
print(subway.index('조세호')) # '조세호'의 index
subway.append('하하') # 리스트 뒤에 '하하'를 추가
subway.insert(1, '정형돈') # index 1에 '정형돈'을 추가
print(subway) # ['유재석', '정형돈', '조세호', '박명수', '하하']
subway.pop() # 맨 뒤의 요소 1개 제거
index를 통해 요소가 위치한 곳의 정보를 알 수 있고 append, insert, pop을 통해 요소를 추가하거나 삽입할 수 있다.
# 리스트 정렬
numList = [5, 2, 4, 3, 1]
numList.sort()
# 리스트 순서 뒤집기
numList.reverse()
# 리스트 내 요소 모두 지우기
numList.clear()
# 리스트는 다양한 자료형을 포함하여 사용할 수 있다.
numList2 = [9, 20, 1, 33]
mixList = ['조세호', 20, True, numList2]
print(mixList) # ['조세호', 20, True, [9, 20, 1, 33]]
# 리스트는 확장이 가능하다.
numList3 = [1, 2, 3, 4, 5]
mixList.extend(numList3)
print(mixList) # ['조세호', 20, True, [9, 20, 1, 33], 1, 2, 3, 4, 5]
print(mixList[0])
sort, reverse를 통해 순서를 정렬할 수 있다. 그리고 리스트는 또다른 리스트나 Boolean, 문자열, 숫자형 등 다양한 자료형을 포함할 수 있다. extend를 통해 확장 또한 가능하다.
딕셔너리 {key1: value, key2: value2, ...}
JavaScript의 Object, 즉 객체와 유사하다. key에 따른 value를 가진 요소들을 담고 있는 집합이다.
딕셔너리에서 value를 가져오는 방법
cabinet = {3:'유재석', 100:'김태호'}
print(cabinet[3])
print(cabinet[100])
# print(cabinet[0])
print(cabinet.get(3))
print(cabinet.get(0)) # get을 사용하여 없는 key를 불러올 때는 에러가 아니라 None을 반환한다.
print(cabinet.get(5, '사용 가능')) # get을 사용하였을 때 None이라면 '사용 가능'을 대신 반환한다. 즉 -1 -> '사용 가능'
딕셔너리 뒤에 [] 안에다가 key값을 작성하면 된다. 만약 존재하지 않는 key값을 작성하면 error가 발생한다. get을 사용하여 value를 가져올 수도 있는데, get은 존재하지 않는 key을 값을 넣었을 때 error를 내지 않고 -1을 반환한다. 이 때 2번째 인자를 삽입하면, 존재하지 않는 key값을 넣었을 때 -1이 아니라 두 번째 인자를 반환한다.
# 해당 key가 dictionary에 있는지 확인
print(3 in cabinet) # True
print(5 in cabinet)
# 새로운 key/value 추가
cabinet = {'A-3': '유재석', 'B-100': '김태호'}
print(cabinet)
cabinet['A-3'] = '김종국'
cabinet['C-20'] = '조세호'
print(cabinet)
# key/value 삭제
del cabinet["B-100"] # del은 작은 따옴표, 큰 따옴표를 구분하지 않는다.
print(cabinet)
# key들만 출력
print(cabinet.keys())
# value들만 출력
print(cabinet.values())
# key/value 쌍으로 출력
print(cabinet.items())
# 모든 key/value 삭제
cabinet.clear() # 리스트와 마찬가지로 clear 사용
print(cabinet)
key in 딕셔너리를 통해 해당 key가 딕셔너리에 존재하는지 확인할 수 있다. 그리고 [] 안에 새로운 key 값을 넣고 = 뒤에 value를 넣어 새로운 key/value 요소를 추가할 수 있다. del을 통해 간단하게 요소를 삭제할 수 있고 keys와 values로 key값들 혹은 value값들만 출력할 수 있다.
튜플 (a, b, ...)
튜플은 리스트와 유사해 보이나, 내용 변경이나 추가는 할 수 없다. 따라서 유연하진 않지만 처리 속도가 빨라진다. 내용 변경이 필요없는 곳에 사용할 때 효율적이다.
menu = ('돈까스', '치즈까스') # 튜플은 [], {}가 아니라 ()을 사용한다.
print(menu[0])
# menu.append('생선까스') # 튜플에서는 요소 추가 등의 변경이 불가능하여 에러가 발생한다.
# 튜플의 활용
name = '김종국'
age = 20
hobby = '코딩'
print(name, age, hobby)
(name, age, hobby) = ('김종국', 20, '코딩')
print(name, age, hobby)
세트 {a, b, ...}
집합, 즉 세트(set)는 중복을 허용하지 않고, 순서가 없다.
my_set = {1, 2, 3, 3, 3} # 딕셔너리와 달리 key가 없다.
print(my_set) # 뒤에 중복되는 3들이 없어진다.
java = {'유재석', '김태호', '양세형'} # 주의하자. 딕셔너리가 아니라 세트이다.
python = set(['유재석', '박명수']) # set를 생성하는 다른 방법.
print(python) # 세트의 경우 순서가 상관없기 때문에 '박명수'가 앞으로 올 수도 있다.
# 요소 추가
python.add('김태호') # 세트에서 요소를 추가하는 방법은 add이다.
print(python)
# 요소 삭제
java.remove('김태호')
print(java)
세트에서는 add와 remove를 통해 요소를 추가하거나 삭제할 수 있다.
교집합, 합집합, 차집합
# 교집합
print(java & python) # {'유재석'}
print(java.intersection(python)) # intersection은 교차라는 뜻
# 합집합
print(java | python) # '유재석'은 중복되지 않는다. {'양세형', '유재석', '박명수', '김태호'}
print(java.union(python))
# 차집합
print(java - python) # java 집합에서 java & python 교집합을 빼는, 오직 java에만 포함되어 있는 요소들. {'양세형', '김태호'}
print(java.difference(python))
자료구조의 변경
menu = {'커피', '우유', '주스'} # 세트 {}
print(menu, type(menu)) # menu의 type도 같이 출력된다.
menu = list(menu) # 리스트로 변경 []
print(menu, type(menu)) # menu의 type으로 리스트가 출력된다.
menu = tuple(menu) # 튜플로 변경 ()
print(menu, type(menu)) # menu의 type으로 튜플이 출력된다.
menu = set(menu) # 세트로 변경 {}
print(menu, type(menu))
menu = dict(menu) # 딕셔너리로 변경 {key: value, ...}
print(menu, type(menu)) # {'주': '스', '우': '유', '커': '피'} <class 'dict'>
python에서는 이렇게 자료구조의 변경이 가능하다.
퀴즈
나의 풀이
from random import *
list = list(range(1, 21)) # 1 부터 21 직전까지, 즉 1 ~ 20까지의 숫자 리스트를 형성한다.
# print(type(range(1, 21))) # 참고로 range의 type은 range이다.
shuffle(list) # shuffle을 통해 list를 무작위로 섞어준다.
chicken = sample(list, 1) # list에서 무작위로 샘플 1개를 뽑는다.
list.remove(chicken[0]) # 중복을 피하기 위해 chicken으로 뽑힌 값은 list에서 삭제
# print(chicken) # sample은 list에서 샘플 1개를 뽑아 리스트 형태로 반환해준다는 것을 알 수 있다.
coffee = sample(list, 3)
print(' -- 당첨자 발표 -- ')
print('치킨 당첨자 :', chicken[0]) # 쉼표를 사용했기 때문에 str(chicken[0])을 해주지 않아도 된다.
print('커피 당첨자 :', coffee)
print(' -- 축하합니다. -- ')
정상적으로 동작을 하지만 인자가 바뀌면 수정해야할 부분이 비교적 많다.
나도코딩님 풀이
from random import *
users = range(1, 21)
users = list(users)
shuffle(users)
winners = sample(users, 4)
print(' -- 당첨자 발표 -- ')
print('치킨 당첨자 : {0}'.format(winners[0]))
print('커피 당첨자 : {0}'.format(winners[1:]))
print(' -- 축하합니다. -- ')
훨씬 깔끔하고 중복도 쉽게 피해간다.