Python-09.List, Tuple, Dictionary and Set

안녕하세요 묵호입니다.
이번 글에서는 리스트, 튜플, 딕셔너리, 집합에 대해 알아보도록 하겠습니다.

List

리스트(List)는 정수, 실수, 문자열과 같은 파이썬의 기본 내장형 타입입니다. 서로 다른 타입이면서도 복수의 값들을 읽고 쓸 수 있는 데이터 타입이지요. 리스트의 형태와 접근에는 다음과 같은 것들이 있습니다.

a = [] # 빈 리스트. a = list()와 같다
b = [1, 2, 3] # 숫자로만 이루어진 리스트
c = ['Life', 'is', 'too', 'short'] # 문자열로만 이루어진 리스트
d = [1, 2, 'Life', 'is'] # 숫자, 문자열로 이루어진 리스트
e = [1, 2, ['Life', 'is']] # List in List
print(e[1])
print(e[2])
print(e[2][0]) # 이중 리스트
print(c[1:3]) # 리스트 슬라이싱
print(str(e[1]) + e[2][0]) # 만약 숫자 데이터와 문자열 데이터를 하나의 문자열 데이터로 합치고 싶다면, 숫자 데이터를 문자열로 형변환 후 합쳐야 합니다.
# 2
# ['Life', 'is']
# Life
# ['is', 'too']
# 2Life

리스트도 +와 *연산이 가능합니다.

a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)
print(a * 2)
# [1, 2, 3, 4, 5, 6]
# [1, 2, 3, 1, 2, 3]

리스트의 길이를 구하기 위해서는 len() 함수를 사용하면 됩니다. len() 함수는 문자열, 리스트 외에도 튜플과 딕셔너리에도 사용 가능합니다.

a = [1, 2, 3]
print(len(a))
# 3

리스트는 값을 수정하거나 삭제할 수 있습니다.

a = [1, 2, 3]
a[1] = 4
print(a)
del a[1] # del a[x]는 a의 x번째 요솟값을 삭제합니다.
print(a)
del a[0:] # 리스트 요소 삭제에도 슬라이싱을 사용할 수 있습니다.
print(a)
# [1, 4, 3]
# [1, 3]
# []


리스트에는 여러 함수들이 있습니다.

  • append(x): 리스트의 맨 뒤에 x 요소를 추가합니다.
a = [1, 2, 3]
a.append(4)
print(a)
# [1, 2, 3, 4]
  • sort(): 리스트의 요소들을 순서대로 정렬합니다.
a = [1, 3, 2, 4]
a.sort() # 오름차순 정렬. a.sort(reverse=False)와 같습니다.
print(a)
a.sort(reverse=True) # 내림차순 정렬
print(a)
# [1, 2, 3, 4]
# [4, 3, 2, 1]
  • reverse(): 리스트를 역순으로 뒤집습니다. 정렬이 아닌, 거꾸로 출력하는 것과 같습니다.
a = [1, 3, 2, 4]
a.reverse()
print(a)
# [4, 2, 3, 1]
  • index(x): 리스트에 x 값이 있으면 x의 index를 반환합니다. 존재하지 않는다면 오류가 발생합니다.
a = [1, 2, 3]
print(a.index(1))
# 0
  • insert(a, b): 리스트의 a번째 위치에 b를 삽입합니다.
a = [1, 2, 3]
a.insert(1, 9)
print(a)
# [1, 9, 2, 3]
  • remove(x): 리스트에서 첫 번째로 나오는 x를 삭제합니다.
a = [1, 2, 3, 1, 2, 3]
a.remove(3)
print(a)
# [1, 2, 1, 2, 3]
  • pop(x): 리스트의 x번째 요소를 돌려주고 그 요소를 삭제합니다. 파라메타를 주지 않을 경우, 맨 마지막 요소를 삭제합니다.
a = [1, 2, 3, 4, 5]
a.pop()
print(a)
a.pop(1)
print(a)
# [1, 2, 3, 4]
# [1, 3, 4]
  • count(x): 리스트 안에 있는 x의 갯수를 반환합니다.
a = [1, 2, 3, 4, 1]
print(a.count(1))
# 2
  • extend(x): x는 오직 리스트만 가능하며, 원래의 a 리스트에 x 리스트를 더합니다.
a = [1, 2, 3]
a.extend([4, 5]) # a += [4, 5]와 동일하다.
print(a)
b = [6, 7]
a.extend(b)
print(a)
# [1, 2, 3, 4, 5]
# [1, 2, 3, 4, 5, 6, 7]


Tuple

튜플은 몇 가지 점을 제외하곤 리스트와 거의 비슷합니다. 튜플이 리스트와 다른 점은 다음과 같습니다.

  1. 리스트는 []로 둘러싸지만 튜플은 ()로 둘러싼다.
  2. 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없다.
t1 = () # 빈 튜플
t2 = (1,) # 튜플은 1개의 요소만을 가질 때 반드시 요소 뒤에 ,를 붙여야 한다.
t3 = (1, 2, 3)
t4 = 1, 2, 3 # 튜플은 괄호를 생략해도 무방하다.
t5 = ('a', 'b', ('ab', 'cd')) # 이중 튜플도 가능하다.

튜플은 값을 변화시킬 수 없습니다. 튜플의 값은 삭제하거나 수정할 수 없다는 것을 다시 한 번 강조합니다.
그 외에 인덱싱, 슬라이싱, +, *, len() 등은 모두 리스트와 동일하게 작동합니다.

t1 = (1, 2, 'a', 'b')
print(t1[1])
print(t1[2])
print(t1[:2])
t2 = (3, 4)
print(t1 + t2)
print(t2 * 2)
len(t1)
# 2
# a
# (1, 2, 'a')
# (1, 2, 'a', 'b', 3, 4)
# (3, 4, 3, 4)
# 4


Dictionary

딕셔너리는 ‘이름’=’고묵호’, ‘전공’=’지리학’ 등 이러한 대응 관계를 나타내는 자료형입니다. 이는 연관 배열(Associative Array) 또는 해시(Hash)라고 합니다.
딕셔너리는 리스트나 튜플처럼 순차적으로 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻습니다.
딕셔너리는 {Key1:Value1, Key2:Value2, Key3:Value3, ...} 이런 모습을 띄고 있습니다. KeyValue의 쌍 여러 개가 {}로 둘러싸여 있습니다. 각각의 요소는 Key : Value 형태로 이루어져 있고 ,로 구분됩니다.

Key에는 변하지 않는 값을 사용하고, Value에는 변하는 값과 변하지 않는 값 모두 사용할 수 있습니다.

딕셔너리 쌍을 추가하는 예시입니다.

a = {1: 'a'}
a[2] = 'b'
a['name'] = 'luna'
a[3] = [1, 2, 3]
print(a)
# {1: 'a', 2: 'b', 'name': 'luna', 3: [1, 2, 3]}

딕셔너리 요소를 삭제하는 예시입니다. del 함수를 사용해 del a[Key]처럼 입력하면 지정한 Key에 해당하는 {Key : Value} 쌍이 삭제됩니다.

del a['name']
print(a)
# {1: 'a', 2: 'b', 3: [1, 2, 3]}

딕셔너리에서 Key를 사용해 Value를 얻는 방법입니다.

grade = {'인문지리학개론':95, '자연지리학개론':85, 5:0}
print(grade['인문지리학개론'])
print(grade[5]) # 리스트처럼 5번째 요소에 접근한다는 뜻이 아니라 딕셔너리 grade의 Key가 5인 요소에 접근하겠다는 뜻이다.
# 95
# 5

딕셔너리에서 Key는 고유한 값이므로, 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다.
또한, 딕셔너리의 Key에 리스트는 사용할 수 없다. 왜냐하면 고유한 값을 가져야 하는 Key에 변할 수 있는 리스트를 사용할 수 있다면 중복된 Key 값이 생길 수 있기 때문이다.

a = {1:'a', 1:'b'}
print(a)
{1: 'b'}

딕셔너리에는 다음과 같은 함수들이 있습니다.

  • keys(): 딕셔너리에서 Key만을 모아서 dict_keys 객체를 반환한다.
a = {'name': 'luna', 'phone': '0123456789', 'birth': '0915'}
a.keys()
# dict_keys(['name', 'phone', 'birth'])

dict_keys 객체는 다음과 같이 사용할 수 있습니다. 리스트의 사용과 큰 차이는 없으나, 리스트 고유의 append, insert, pop, remove, sort 함수는 사용할 수 없습니다.

for k in a.keys():
    print(k)

# name
# phone
# birth

dict_keys 객체를 리스트로 변환하려면 list(a.keys())를 하면 됩니다.

  • values(): 딕셔너리에서 Value만을 모아서 dict_values 객체를 반환한다.
a.values()
dict_values(['luna', '0123456789', '0915'])
  • items(): Key와 Value의 쌍을 튜플로 묶은 값을 dict_items 객체로 반환한다.
a.items()
# dict_items([('name', 'luna'), ('phone', '0123456789'), ('birth', '0915')])
  • clear(): 딕셔너리 안의 모든 요소를 삭제한다.
a.clear()
a
# {}
  • get(x): x라는 Key에 대응되는 Value를 반환한다.
    a.get(‘name’)과 a[‘name’]은 동일한 결과를 보인다. 단, 없는 Key를 넣었을 경우 get(Key) 함수는 None을, a[Key]는 오류를 반환한다.
    만약, 딕셔너리 안에 찾으려는 Key값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는 get(x, ‘default’)을 사용하면 된다.
a = {'name':'luna', 'phone':'0123456789', 'birth': '0915'}
print(a.get('age'))
print(a.get('age', 'Ang'))
# None
# Ang
  • in: 해당 Key가 딕셔너리 안에 있는지 확인한다. 존재하면 True를, 그렇지 않으면 False를 반환한다. 이는 리스트 등에서도 사용할 수 있다.
a = {'name':'luna', 'phone':'0123456789', 'birth': '0915'}
print('name' in a)
print('age' in a)
# True
# False


Set

집합 자료형은 집합에 관련된 것을 쉽게 처리하기 위해 만들어진 자료형입니다. set 키워드를 통해 만들 수 있으며, set()의 괄호 안에 리스트를 입력하여 만들거나 문자열을 입력해 만들 수 있습니다.

s0 = set()
s1 = set([1, 2, 3])
s2 = set("Hello")
print(s0)
print(s1)
print(s2)
# set()
# {1, 2, 3}
# {'e', 'H', 'l', 'o'}

set(“Hello”)의 결과는 왜 저럴까요? l이 하나이고 순서가 뒤죽박죽입니다. set에는 다음과 같은 2가지의 특징이 있습니다.

  1. 중복을 허용하지 않는다.
  2. 순서가 없다. 리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있지만 set는 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없습니다.(딕셔너리도 그러하죠) 만약 set에 저장된 값을 인덱싱을 통해 접근하고 싶다면, 리스트 또는 튜플로 변환한 후 해야 합니다.
st = set([1, 2, 3])
lst = list(st)
tpl = tuple(st)
print(lst[1])
print(tpl[2])
# 2
# 3

중복을 허용하지 않는 집합 자료형의 특징은 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용됩니다.

Set 자료형으로 교집합, 합집합, 차집합을 구할 수 있습니다.

  • 교집합
s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

print(s1 & s2)
print(s1.intersection(s2)) # print(s2.intersection(s1))와 결과가 같다.
# {4, 5, 6}
# {4, 5, 6}
  • 합집합
s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

print(s1 | s2)
print(s1.union(s2)) # print(s2.union(s1))와 결과가 같다.
# {1, 2, 3, 4, 5, 6, 7, 8, 9}
# {1, 2, 3, 4, 5, 6, 7, 8, 9}
  • 차집합
s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

print(s1 - s2)
print(s1.union(s2))
print(s2 - s1)
print(s2.union(s1))
# {1, 2, 3}
# {1, 2, 3}
# {8, 9, 7}
# {8, 9, 7}


Set 자료형 관련 함수들입니다.

  • add(x): 이미 만들어진 set 자료형에 1개의 값만 추가할 때 사용한다.
st = set([1, 2, 3])
st.add(4)
print(st)
# {1, 2, 3, 4}
  • update(x): 여러 개의 값을 한꺼번에 추가할 때 사용한다.
st = set([1, 2, 3])
st.update([4, 5, 6]])
print(st)
# {1, 2, 3, 4, 5, 6}
  • remove(x): 특정 값을 제거할 때 사용한다.
st = set([1, 2, 3])
st.remove(2)
print(st)
# {1, 3}



다음 시간에는 반복문에 대해 알아보겠습니다.
그럼.. 바위^^