1. 리스트
C언어에서의 배열과 비슷하며, 같은 형태의 여러 자료를 함께 관리하기에 좋다.
다만 배열과의 차이점이라고 할 수 있는 것은,
배열은 하나의 배열에 저장되어 있는 데이터의 자료형이 모두 같아야 하지만,
리스트에서는 서로 다른 자료형의 데이터를 하나의 리스트에 저장할 수 있다. (그러나 대게 같은 자료형의 데이터를 저장함)
1) 선언 및 초기화
빈 리스트를 선언하고자 할 때에는 다음과 같이 한다.
# 빈 리스트 선언
l = []
리스트를 선언과 함께 초기화까지 하고 싶은 경우 다음과 같이 작성할 수 있다.
l = [0]
이렇게 할 경우 리스트의 원소 자리 하나만을 0으로 초기화하는 것이 된다.
현재 l의 길이는 1이 된다.
그렇다면 리스트의 크기를 3으로 하면서 0으로 초기화하고 싶은 경우에는 다음과 같이 작성할 수 있을 것이다.
l = [0, 0, 0]
그렇다면 리스트의 크기를 100으로 하고 싶을 때에는 0을 100번 써주어야 하는 것일까?
이 경우에는 다음의 방법을 이용해 좀 더 편리하게 초기화를 할 수 있다.
l = [0] * 100
2) 원소 접근 및 수정
C언어의 배열과 같이 Python의 리스트에서도 리스트의 첫 원소의 인덱스 번호는 0부터 시작한다.
그렇기 때문에 제일 첫 번째 원소에 접근하고 싶은 경우에는 다음과 같이 0에 접근해야 한다.
l = [0, 2, 3]
print(l[0]) # 0
print(l[2]) # 3
l[0] = 1 # l = [1, 2, 3]
print(l[0]) # 1
3) 원소 추가
이미 선언된 리스트에 새로운 원소를 추가하고 싶은 경우 다음의 방법을 사용할 수 있다.
l.append(4) # l = [1, 2, 3, 4]
리스트의 중간에 원소를 추가하고 싶은 경우 다음의 방법을 사용한다.
l.insert(1, 5) # l = [1, 5, 2, 3, 4]
insert 함수의 첫 번째 인자로 추가할 원소가 갖게 될 인덱스를 입력하고, 두 번째 인자로 추가할 원소의 값을 입력하면 된다.
4) 원소 삭제
리스트의 값을 기준으로 원소를 삭제하고 싶은 경우
만일, 리스트에 원하는 값이 중복될 경우 인덱스 번호가 가장 낮은 위치에 있는 원소를 삭제한다.
l.remove(2) # l = [1, 5, 3, 4]
리스트의 인덱스를 기준으로 원소를 삭제하고 싶은 경우
만일, 인덱스를 지정해주지 않으면 리스트의 가장 마지막 원소를 삭제하고 반환한다.
e = l.pop(1) # l = [1, 3, 4]
print(e) # 5
* pop() 말고 del 키워드를 이용하는 방법도 있다. 이 경우에는 삭제되는 원소를 반환하지 않는다.
del l[2] # l = [1, 3]
리스트의 모든 원소를 삭제하고 싶은 경우
l.clear() # l = []
# 또는
del l[:]
2. 튜플
튜플은 리스트와 비슷하지만 변경할 수 없어, 참조형 리스트를 만들 때 사용된다.
1) 초기화
리스트는 대괄호[]를 사용했다면 튜플은 소괄호()를 사용한다.
또한 튜플은 단순히 여러 데이터를 콤마로 연결한 것으로 초기화를 할 수도 있다.
t1 = (1, 2, 3) # type(t1) : tuple
t2 = 1, 2, 3 # type(t2) : tuple
2) 튜플의 데이터가 변경될 수 있는 경우
튜플 자료형 자체는 원래 그 안의 데이터를 변경할 수 없게 되어있다.
그러나 튜플 안의 데이터가 리스트라면?
튜플에 또 다른 데이터를 추가하거나 수정하는 것은 안되지만, 튜플 내의 리스트를 수정하는 것은 가능하다.
t = (1, [1, 2, 3])
t[0] = 2 ## 사용 불가능한 코드
t[1][0] = 0 # t = (1, [0, 2, 3])
t[1].append(4) # t = (1, [0, 2, 3, 4])
t[1].clear() # t = (1, [])
3. 집합
집합은 중복된 요소가 없는 리스트라고 생각하면 된다.
중괄호{}를 사용하고, 집합을 사용하면 합집합, 교집합, 차집합과 같은 집합 연산이 가능하다.
따라서 대게 리스트의 중복 요소를 제거하거나 집합 연산이 필요할 때 사용된다.
1) 선언 및 초기화
여기서 주의해야할 점은 빈 집합을 선언하려고 할 때 s = {} 라고 할 경우, 빈 집합이 아닌 빈 딕셔너리가 선언된다.
또한 집합 초기화 시 중복된 원소를 입력하면 집합의 원소에는 입력된 값 중 중복된 원소를 제거한 나머지 원소들만 저장이 된다.
# 빈 집합 선언
s = set()
# 집합 초기화
s = { 1, 2, 3, 2, 3, 4 }
print(s) # { 1, 2, 3, 4 }
2) 원소 추가 및 삭제
# add(): 추가
>>> a.add(5)
>>> a
{1, 2, 3, 4, 5}
# remove(): 삭제
>>> b.remove(8)
>>> b
{2, 4, 6}
3) 집합 연산 기능
a = { 1, 2, 3, 4 }
b = { 2, 4, 6, 8 }
# in, not in: 원소의 존재 유무 반환
>>> 1 in a
True
>>> 1 not in b
True
# &: 교집합 반환
>>> a & b
{2, 4}
# |: 합집합 반환
>>> a | b
{1, 2, 3, 4, 6, 8}
# -: 차집합 반환
>>> a - b
{1, 3}
여기서 교집합, 합집합, 차집합은 다음의 함수를 이용해서도 구할 수 있다.
# intersection(): 교집합 반환
>>> a.intersection(b)
{2, 4}
# union(): 합집합 반환
>>> a.union(b)
{1, 2, 3, 4, 6, 8}
# difference(): 차집합 반환
>>> a.difference(b)
{1, 3}
4. 딕셔너리
딕셔너리는 JSON 과 비슷하게 생각하면 좋을 것 같다.
리스트나 튜플과 마찬가지로 여러 데이터를 함께 이용할 때 사용하지만,
차이점이라면 딕셔너리는 각 데이터를 인덱스가 아닌 key값으로 접근한다.
따라서 key값은 딕셔너리 내에서 고유한 값이어야 한다.
딕셔너리는 중괄호{}를 사용한다.
1) 선언 및 초기화
# 빈 딕셔너리 선언
d = {}
# 딕셔너리 초기화
d = { 'key' : 'value' }
만약 딕셔너리 초기화 시 동일한 key값을 입력하면 오류가 발생할까?
d = { 'key' : 'value1', 'key' : 'value2' }
print(d) # { 'key' : 'value2' }
오류는 발생하지 않고, 동일한 key값이 입력되면 value는 가장 마지막에 입력한 값으로 초기화되는 것을 알 수 있다.
2) 원소 접근 및 수정
인덱스 대신 key를 사용하므로 원소에 접근할 때에도 key값을 사용하여 접근하면 된다.
d = { 'a' : 'A', 'b' : 'B', 'c' : 'C' }
print(d['a']) # 'A'
d['a'] = 'a' # d = { 'a' : 'a', 'b' : 'B', 'c' : 'C' }
3) 원소 추가
딕셔너리에 새로운 원소를 추가하고 싶은 경우
추가하고자 하는 key와 value를 이용해, 원소에 접근할 때와 마찬가지 문법으로 추가할 수 있다.
d['d'] = 'D'
# d = { 'a' : 'a', 'b' : 'B', 'c' : 'C', 'd' : 'D' }
4) 원소 삭제
딕셔너리의 원소를 삭제하고 싶은 경우
삭제하고자 하는 key값과 del 키워드를 이용해 삭제할 수 있다.
del dic['a']
# d = { 'b' : 'B', 'c' : 'C', 'd' : 'D' }
5) 딕셔너리 순회
딕셔너리는 key를 인덱스로 사용하기 때문에 순회를 하려고 할 때 난감하게 느껴질 수 있다.
그러나 다음의 함수를 사용하면 쉽게 해결이 된다.
- 1 : 순회할 때 key와 value 를 사용하려고 하는 경우, items()를 이용하면 된다.
d = { 'first' : 1, 'second' : 2, 'third' : 3 }
for key, value in d.items():
print(key, value)
'''
print:
first 1
second 2
third 3
'''
- 2 : 순회할 때 index와 key를 사용하려고 하는 경우, enumerate()를 이용하면 된다.
d = { 'first' : 1, 'second' : 2, 'third' : 3 }
for index, key in enumerate(d):
print(index, key)
'''
print:
0 first
1 second
2 third
'''