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

 

리스트 [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에서는 이렇게 자료구조의 변경이 가능하다.

 

퀴즈

'''
Quiz) 당신의 학교에서는 파이썬 코딩 대회를 주최합니다.
참석률을 높이기 위해 댓글 이벤트를 진행하기로 하였습니다.
댓글 작성자들 중 추첨을 통해 1명은 치킨, 3명은 커피 쿠폰을 받게 됩니다.
추첨 프로그램을 작성하시오.

(조건)
1. 편의상 댓글은 20명이 작성하였고 아이디는 1 ~ 20이라고 가정
2. 댓글 내용과 상관 없이 무작위로 추첨하되 중복 불가
3. random 모듈의 shuffle과 sample 활용

(출력 예제)
 -- 당첨자 발표 --
치킨 당첨자 : 1
커피 당첨자 : [2, 3, 4]
 -- 축하합니다. --

(활용 예제)
from random import *
list = [1, 2, 3, 4, 5]
print(list)
shuffle(list)
print(list)
print(sample(list, 1))
'''

 

나의 풀이

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(' -- 축하합니다. -- ')

 훨씬 깔끔하고 중복도 쉽게 피해간다.

'프로그래밍 > Python' 카테고리의 다른 글

조건문과 반복문  (0) 2022.03.08
문자열  (0) 2022.03.04
연산자  (0) 2022.03.03
자료형  (0) 2022.03.03

+ Recent posts