[References]
http://pythonstudy.xyz
9. 리스트(List)
순서가 있는 값들의 나열
요소(원소) : List를 구성하는 값
한 가지 Type으로만 이루어진 List 뿐만 아니라 여러 가지 Type의 Data로 이루어진 List를 구성할 수도 있다.
Python의 List는 동적 배열(Dynamic Array)로서 자유롭게 확장할 수 있는 구조를 갖는다.
List는 요소들을 대괄호(Square bracket, [])로 둘러싸고 요소와 요소 사이에는 Comma(,)로 구분하여 만든다.
요소가 없는 빈 List는 "[]"와 같이 표현한다.
# 빈 List
lst = []
lst = [1, 2, 5, 'a', 'b']
print(lst)
# [1, 2, 5, 'a', 'b']
print(type(lst))
# <class 'list'>
List 내에 실수와 정수, 문자열이 들어갈 수 있고 List 내에 List가 들어갈 수도 있다.
List도 Indexing과 Slicing이 가능하다.
lst = [1, 2, 'a', 'b', 'red', 'beaf', ['a', 'b', 'c']]
print(lst[3])
# 'b'
print(lst[-2])
# 'beaf'
print(lst[1:3])
# [2, 'a']
print(lst[2:5])
# ['a', 'b', 'red']
print(lst[6][2])
# 'c'
문자열과 같이 List에도 0부터 시작하는 Index가 존재하며 시작 위치와 끝 위치를 가지고 잘라낸 요소 List를 가져올 수 있다.
Index에 -1, -2 같은 음수를 사용할 수 있다. 이 때, -1은 현재 List의 마지막 요소를, -2는 뒤에서 두 번째 요소를 가리킨다.
List에서 일부 부분 요소들을 선택하기 위하여 Slice를 사용할 수 있다. Slicing은 "List[First Index : Last Index]"와 같이 Index 표현에서 부분 집합의 범위를 지정하는 것이다. Index는 0부터 시작하며, 마지막 Index를 원하면 "마지막 요소의 Index + 1"로 지정한다. 만약 처음 Index가 생략되면 0부터 시작되며, 마지막 Index가 생략되면 List의 끝까지 포함됨을 의미한다.
List는 문자열과는 다르게 Indexing을 통하여 List의 요소를 변경할 수 있다.
lst = [1, 2, 'a', 'b', 'red', 'beaf']
lst[2] = 3
lst[4] = 'bue'
print(lst)
# [1, 2, 3, 'b', 'bue', 'beaf']
문자열과 마찬가지로 +, * 연산자가 지원된다.
lst1 = ['A', 'B', 'C']
lst2 = ['D', 'E', 'F']
print(lst1 + lst2)
# ['A', 'B', 'C', 'D', 'E', 'F']
print(lst1 * 3)
# ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']
List Method
① append : List에 요소를 추가
새로 값이 추가되는 위치는 List의 가장 뒤이다.
추가되는 값의 형태는 정수, 실수, Tuple, List 등의 여러 가지 Type이 올 수 있다.
lst = ['A', 'b', 1, 3.14, 10.16]
lst.append([1, 2, 3])
print(lst)
# ['A', 'b', 1, 3.14, 10.16, [1, 2, 3]]
② insert : List에 요소를 삽입
append 함수와는 달리 지정한 위치에 추가하려는 값을 넣을 수 있다.
첫 번째 인수 : 요소가 추가될 위치
두 번째 인수 : List에 삽입될 값
nums = ['one', 'two', 'three', 'five', 'six']
nums.insert(3, 'four')
print(nums)
# ['one', 'two', 'three', 'four', 'five', 'six']
③ extend : List를 확장
한 가지씩 값을 추가하는 append 함수와는 달리 여러 개의 값을 추가할 수 있다.
함수로 전달되는 인수에는 List만 올 수 있다.
nums = [1, 2, 3, 4, 5, 6]
nums.extend([7, 8, 9])
print(nums)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
④ index : List에 있는 특정 요소의 위치를 확인
index의 첫 번째 인수 : 찾으려는 요소의 값
index의 두 번째 인수 : 탐색이 시작하는 위치 (생략 가능)
index의 세 번째 인수 : 탐색이 끝나는 위치 (생략 가능)
검색 결과에서 가장 처음으로 등장하는 요소의 위치를 출력
lst = ['red', 'blue', 'green', 'yellow', 'white', 'black', 'blue']
print(lst.index('blue'))
# 1
print(lst.index('blue', 2))
# 6
print(lst.index('yellow', 2, 4))
# 3
⑤ count : List에 존재하는 특정 요소의 수를 확인
lst = [1, 2, 1, 4, 5, 1, 3, 6, 6, 9, 5, 4]
print(lst.count(1))
# 3
print(lst.count(6))
# 2
⑥ pop : List의 요소를 꺼냄
pop 함수는 인수를 생략하고 사용할 수 있다.
특정한 요소를 List에서 꺼내려면 함수의 첫 번째 인수로 꺼내려는 요소의 Index를 적어주면 된다.
pop 함수로 요소를 꺼내고 나면 그 위치에 있는 요소가 List에서 제외된다.
a = ['a', 'b', 'c', 'd', 'e']
a.pop()
# 'e'
print(a)
# ['a', 'b', 'c', 'd']
a.pop(1)
# 'b'
print(a)
# ['a', 'c', 'd']
⑦ remove : List의 요소를 제거
pop 함수와는 다르게 List에서 할당하는 값만을 제거
제거하려는 값이 List에 여러 개가 존재하면 가장 앞에 있는 요소부터 제거된다.
a = [1, 2, 1, 3, 4, 1]
a.remove(1)
print(a)
# [2, 1, 3, 4, 1]
⑧ sort : List의 요소들을 정렬
전달되는 인수를 통해서 정렬 방식을 변경할 수 있으며 반전 여부를 지정할 수도 있다.
a = [3, 5, 1, 2, 9]
a.sort()
print(a)
# [1, 2, 3, 5, 9]
아래 예제와 같이 역순으로 정렬할 수도 있다. reverse를 True로 만들어주지 않을 경우에는 reverse의 기본값이 False이기 때문에 순서대로 정렬된 Data를 얻을 수 있다.
a = [3, 5, 1, 2, 9]
a.sort(reverse=True)
print(a)
# [9, 5, 3, 2, 1]
⑨ reverse : List를 역순으로 뒤집음.
a = [1, 7, 5, 3, 9]
a.reverse()
print(a)
# [9, 3, 5, 7, 1]
Del : List 요소를 삭제
a = [1, 3, 5, 7, 9]
del a[2]
print(a)
# [1, 3, 7, 9]
List 안의 for Loop
[표현식] for [요소] in [Collection] [if 조건식]
List의 [ ] 괄호 안에 for 루프를 사용한 표현식(Expression)을 통해 List 요소들을 정의
Collection으로부터 요소를 하나씩 가져와 표현식을 실행하여 그 결과를 List에 담는다.
[if 조건식]은 옵션으로 추가될 수 있다. 조건식에 맞는 요소만이 for Loop의 표현식에서 실행될 수 있다.
아래 예제는 0부터 9까지 숫자들 중 3으로 나눈 나머지가 0인 숫자에 대해 그 제곱에 대한 List를 구한 예이다.
list = [n ** 2 for n in range(10) if n % 3 == 0]
print(list)
# [0, 9, 36, 81]
10. 튜플 (Tuple)
List와는 다르게 소괄호 ( )로 묶어서 표현
요소 변경이 가능한 List와는 다르게 Tuple은 요소 변경이 불가능
요소가 없는 빈 Tuple은 "()"와 같이 표현
읽기 전용인 만큼 제공되는 함수가 List에 비해 적지만 속도는 그 만큼 빠르다.
각 요소들은 Comma(,)로 구분
Tuple 안에 Tuple을 요소로 가질 수 있음.
tuples = (1, 2, 'a', 'b')
tuples = ('a',)
tuples = 'a', 'b', 'c'
tuples = ('a', 'b', ('c', 'd'))
요소 한 개를 가지는 Tuple을 만들기 위해서는 마지막에 쉼표를 넣어주어야 한다. 만약 쉼표가 없다면 소괄호로 둘러싸인 문자열로 취급을 한다.
소괄호로 둘러싸지 않은 형식을 사용할 수 있다.
변수 할당 : Tuple Data를 변수에 할당할 때, 각 요소를 각각 다른 변수에 할당할 수 있다. 예를 들어, 아래 예제에서 첫 번째 예의 name 변수는 Tuple 전체를 할당받는 변수이지만, 두 번째의 firstname, lastname 변수는 Tuple에 있는 각 요소를 하나씩 할당받는 변수들이다.
name = ("John", "Kim")
print(name)
# ('John', 'Kim')
firstname, lastname = ("John", "Kim")
print(lastname, ",", firstname)
# Kim, John
Tuple을 통해서 임시로 값을 저장하는 변수 없이 아래의 예제와 같이 두 변수의 값을 서로 바꿀 수도 있다.
a, b = 10, 20
print(a, b)
# 10, 20
a, b = b, a
print(a, b)
# 20, 10
Indexing과 Slicing : List와 마찬가지로 한 요소를 Return하는 Indexing과 특정 부분 집합을 Return하는 Slicing을 지원한다. 단, 요소 값을 변경하거나 추가 혹은 삭제하는 일은 할 수 없다.
tuples = (0, 1, 2, 3, 4, 5, 6)
print(tuples[1])
# 1
print(tuples[-2])
# 5
tuples = (0, 1, 2, 3, 4, 5, 6)
print(tuples[1:3])
# (1, 2)
print(tuples[3:])
# (3, 4, 5, 6)
+, * 연산자
tuples = ('a', 'b', 'c')
print(tuples + ('d', 'e', 'f'))
# ('a', 'b', 'c', 'd', 'e', 'f')
print(tuples * 3)
# ('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')
10. Dictionary (Map)
"키(Key) : 값(Value)" 쌍을 요소로 갖는 Collection
Dictionary는 흔히 Map이라고도 부르는데, Key 값으로 그 Value를 신속하게 찾아내는 Hash Table 구조를 갖는다.
Dictionary의 요소들은 Curly Brace { }를 사용하여 Collection을 표현한다.
각 요소들은 Key-Value 쌍으로 되어 있으며, 요소 간은 Comma(,)로 구분한다.
요소가 없는 빈 Dictionary는 "{}"와 같이 표현한다.
Tuple이나 List와는 다르게 위치를 통한 Indexing이 허용되지 않는다. 때문에 Slice 역시 사용할 수 없다.
특정 요소를 찾아 읽고 쓰기 위해서는 "Dictionary 변수[Key]"와 같이 Key를 Index처럼 사용한다.
dic = {'name':'john', 'age':36, 'e-mail':'johes@python.com'}
print(dic['name'])
# 'john'
print(dic['e-mail'])
# 'johes@python.com'
# 위치를 통한 Indexing이 불가능
print(dic[0])
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
dic[0]
KeyError: 0
Key와 Value는 Colon(:)으로 구분한다.
dic = {'name':'smith', 'rank':1, 'average':97.5}
print(type(dic))
# <class 'dict'>
print(dic)
# {'name': 'smith', 'average': 97.5, 'rank': 1}
Dictionary의 Key는 그 값이 변경되지 않는 Immutable Type만이 허용된다. 예를 들어, 숫자, 문자열, Tuple은 Key로 사용될 수 있는 반면, List, Dictionary는 Key로 사용될 수 없다.
dic1 = {123:456, 3.14:1592, (1, 3):(3, 1)}
dic2 = {'abc':'def', 'list':[1, 2, 3], 'dic':{1:2, 3:4, 5:6}}
print(dic1)
# {(1, 3): (3, 1), 3.14: 1592, 123: 456}
print(dic2)
# {'abc': 'def', 'list': [1, 2, 3], 'dic': {1: 2, 3: 4, 5: 6}}
Key를 통해 Value를 추가 또는 변경할 수 있다. 그러나 Key는 변경할 수 없다.
dic = {'key1':'value1', 'key2':'value2'}
# 수정
dic['key1'] = 'value3'
# 수정
dic['key2'] = 'value4'
# 추가
dic['key3'] = 'value5'
print(type(dic))
# {'key1': 'value3', 'key3': 'value5', 'key2': 'value4'}
Dictionary에서 Key는 중복되지 않도록 주의해야 한다. 만약 두 개 이상의 같은 Key가 존재한다면 어떤 값이 Return 되는지 파악하기 어렵다.
Dictionary에서 요소를 제거하려면 del이라는 내장 함수를 사용한다.
dic = {'a':'b', 'c':'d', 'e':'f'}
print(dic)
# {'c': 'd', 'e': 'f', 'a': 'b'}
del dic['a']
print(dic)
# {'c': 'd', 'e': 'f'}
Dictionary Utility Function
① keys() : Dictionary의 Key를 List 형태의 Dictionary 객체로 반환
dic = {'name':'Jooyeon', 'phone':'01013132580', 'age':'20'}
print(dic.keys())
# dict_keys(['name', 'age', 'phone'])
for문을 사용하게 되면 key 함수가 return한 dict_keys 객체를 통해서 그 값들을 순회하여 접근할 수 있다.
dic = {'name':'Jooyeon', 'phone':'01013132580', 'age':'20'}
for i in dic.keys():
print(i)
# name
# age
# phone
② values() : Dictionary의 Value를 List 형태의 Dictionary 객체로 반환
dic = {'name':'Jooyeon', 'phone':'01013132580', 'age':'20'}
print(dic.values())
dict_values(['Jooyeon', '20', '01013132580'])
③ items() : Key와 Value으로 이루어진 여러 개의 Tuple을 List 형태의 Dictionary 객체로 반환
dic = {'name':'Jooyeon', 'phone':'01013132580', 'age':'20'}
print(dic.items())
# dict_items([('name', 'Jooyeon'), ('age', '20'), ('phone', '01013132580')])
scores = {"A": 90, "B": 85, "C": 80}
for key in scores:
val = scores[key]
print("%s : %d" % (key, val))
# A : 90
# C : 80
# B : 85
dict_items 객체를 List로 변환하기 위해서는 list()를 사용할 수 있다. 이는 dict_keys, dict_values 객체에도 적용된다.
dic = {'name':'Jooyeon', 'phone':'01013132580', 'age':'20'}
dic.items()
items_list = list(dic)
print(items_list)
# ['name', 'age', 'phone']
④ clear() : Dictionary 초기화
dic = {'name':'Jooyeon', 'phone':'01013132580', 'age':'20'}
dic.clear()
print(dic)
# { }
⑤ get() : Dictionary의 Key에 해당하는 값을 반환
Dictionary[Key]를 사용하면 Key가 없을 때 Error(KeyError)를 Return하는 반면, get()은 Key가 Dictionary에 없을 경우 None을 Return하므로 더 유용하다.
get()을 사용하는 대신 해당 Key가 Dictionary에 존재하는지 체크하고 Dictionary[Key]를 사용하는 방법도 있다. Key가 Dictionary에 존재하는지를 체크하기 위해서는 Membership 연산자 in을 사용하면 된다.
dic = {'name':'Jooyeon', 'phone':'01013132580', 'age':'20'}
print(dic.get('phone'))
# '01013132580'
print(dic.get('age'))
# '20'
print(dic.get('john'))
# None
print(dic['john'])
Traceback (most recent call last):
File "<pyshell#62>", line 1, in <module>
dic['john']
KeyError: 'john'
# Membership 연산자 in 사용
if "john" in dic:
print(dic['john'])
# None
⑥ in : Dictionary 안에서의 Key 존재 여부 검사
dic = {'name':'Jooyeon', 'phone':'01013132580', 'age':'20'}
print('name' in dic)
# True
print('job' in dic)
# False
13. Set
Set : 중복이 없는 요소들 (unique elements)로만 구성된 집합 Collection
Curly Brace { }를 사용하여 Collection을 표현
내부적으로 요소들을 순서대로 저장하지 않기 때문에, 순서에 의존하는 기능들을 사용할 수 없다.
set을 정의할 때, 중복된 값을 입력하는 경우, set은 중복된 값을 한 번만 가지고 있게 된다.
List나 Tuple 등을 set으로 변경하기 위해서는 set() 함수를 사용한다. 이는 List에 중복된 값들이 있을 때, 중복 없이 Unique한 값만을 얻고자 할 때 유용하다.
# set 정의
myset = { 1, 1, 3, 5, 5 }
print(myset)
# {1, 3, 5}
# List를 set으로 변환
mylist = ["A", "A", "B", "B", "B"]
s = set(mylist)
print(s)
# 출력: {'A', 'B'}
Set에서의 추가 및 삭제
① add() : Set에 하나의 새로운 요소를 추가
② update() : Set에 여러 개의 요소들을 한꺼번에 추가
③ remove() : Set에서 하나의 요소를 삭제
④ clear() : Set 전체를 모두 삭제
a = {1, 3, 5}
# 하나만 추가
myset.add(7)
print(myset)
# {1, 3, 5, 7}
# 여러 개 추가
myset.update({4, 2, 10})
print(myset)
# {1, 2, 3, 4, 5, 7, 10}
# 하나만 삭제
myset.remove(1)
print(myset)
# {2, 3, 4, 5, 7, 10}
# 모두 삭제
myset.clear()
print(myset)
# set()
Set 연산
① 교집합 : a와 b가 set 일 때, 교집합은 a & b (또는 a.intersection(b))
② 합집합 : a와 b가 set 일 때, 합집합은 a | b (또는 a.union(b))
③ 차집합 : a와 b가 set 일 때, 차집합은 a - b (또는 a.difference(b))
a = {1, 3, 5}
b = {1, 2, 5}
# 교집합
print(a & b)
# {1, 5}
# 합집합
print(a | b)
# {1, 2, 3, 5}
# 차집합
print(a - b)
# {3}