앞서 숫자와 문자열에 대해서 배웠는데, 숫자와 문자열만으로 프로그래밍을 하기에는 부족한 점이 많다.
예를 들어 1부터 10까지의 숫자 중 홀수의 모음인 1,3,5,7,9의 집합을 생각해보면,
숫자나 문자열로 표현하기에는 어렵다.
파이썬은 이러한 불편함을 해소할 수 있는 자료형이 존재한다.(이것이 리스트[List]이다.)
리스트를 사용하면1,3,5,7,9의 숫자 모음을 다음과 같이 간단하게 표현할 수 있다.
>> odd = [1,3,5,7,9]
- 리스트를 만들 때는 위에서 보는 것과 같이 대괄호([])로 감싸 주고 각 요솟값은 쉼표(,)로 구분해 준다.
리스트명 = [요소1, 요소2, 요소3, ...]
리스튿 문자열 처럼 인덱싱과 슬라이싱이 가능하다.
먼저 a변수에 [1,2,3]값을 설정한다.
>>> a = [1,2,3]
>>> a
[1,2,3]
a[0]은 리스트 a의 첫 번째 요솟값을 말한다.
>>> a[0]
1
다음 은 a[0]와 a[2]의 값을 더한 예이다.
>>> a[0] + a[2]
4
문자열을 공부할 때 이미 살펴보았지만, 파이썬은 숫자를 0부터 세기 때문에 a[1]이 리스트 a의 첫번째 요소가 아니라 a[0]이 리스트 a의 첫 번째 요소라는 것을 명심하자!
a[-1]은 문자열에서와 마찬가지로 리스트 a의 마지막 요솟값을 말한다.>> a[-1] 3
이번에는 리스트 a를 숫자 1,2,3과 또 다른 리스트인 ['a','b','c']를 포함하도록 만들어 보자.
>>> a = [1, 2, 3, ['a', 'b', 'c']]
그리고 다음 예제를 따라해보자!
>>> a[0]
1
>>> a[-1]
['a', 'b', 'c']
>>> a[3]
['a', 'b', 'c']
그렇다면 리스트 a에 포함된 ['a', 'b', 'c'] 리스트에서 'a' 값을 인덱싱을 사용해 끄집어 낼 수 있는 방법은 없을까? 다음 예제를 살펴 보자!
>>> a[-1][0]
'a'
'b'와 'c'도 마찬가지로 하면 된다!
>>> a[-1][1]
'b'
>>> a[-1][2]
'c'
조금 복잡하지만, 리스트를 다음과 같이 작성할 수도 있다.
>> a = [1,2,['a','b',['Life','is']]]
리스트 a 안에 ['a', 'b', ['Life', 'is']] 리스트가 포함되어 있고 그 리스트 안에 다시 ['Life', 'is'] 리스트가 포함되어 있다.
즉, 삼중 구조의 리스트이다.
이 경우, 'Life' 문자열만 끄집어 내려면 다음과 같이 해야 한다.>> a[2][2][0] 'Life'
문자열과 마찬가지로 리스트에서도 슬라이싱 기법을 적용할 수 있다. 슬라이싱은 '잘라 낸다'라는 뜻이라고 했다.
>>> a = [1, 2, 3, 4, 5]
>>> a[0:2]
[1,2]
앞의 예를 문자열에서 슬라이싱했던 예와 비교해 보자.
>>> a = "12345"
>>> a[0:2]
'12'
몇 가지 예를 더 살펴보자.
>>> a = [1, 2, 3, 4, 5]
>>> b = a[:2]
>>> c = a[2:]
>>> b
[1, 2]
>>> c
[3, 4, 5]
리스트가 포함된 중첩 리스트 역시 슬라이싱 방법은 똑같이 적용된다.
>> a = [1, 2, 3, ['a', 'b', 'c'], 4, 5] >> a[2:5] [3, ['a', 'b', 'c'], 4] >> a[3][:2] ['a', 'b']
리스트 역시 +
를 사용해서 더할 수 있고 *
를 사용해서 반복할 수 있다. 문자열과 마찬가지로 리스트에서도 되는지 직접 확인해 보자.
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
*
)>>> a = [1, 2, 3]
>>> a * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
리스트 길이를 구하기 위해서는 다음처럼 len 함수를 사용해야 한다.
>>> a = [1,2,3]
>>> len(a)
3
다음 소스 코드를 입력했을 때 결괏값은 어떻게 나올까?
>> a = [1,2,3] >> a[2[ + "hi"
- a[2]의 값인 3과 문자열 hi가 더해져서 3hi가 출력될 것이라고 생각할 수 있다. 하지만 다음 결과를 살펴보니 오류가 발생했다. 오류의 원인은 무엇일까?
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str'
- a[2]에 저장된 값은 3이라는 정수인데 "hi"는 문자열이다. 정수와 문자열은 당연히 서로 더할 수 없기 때문에 오류가 발생한 것이다.
- 만약 숫자와 문자열을 더해서 '3hi'를 만들고 싶다면 다음처럼 숫자 3을 문자 '3'으로 바꾸어야 한다.
>> str(a[2]) + "hi" 3hi
- str은 정수나 실수를 문자열로 바꾸어 주는 파이썬 내장 함수이다.
>>> a = [1,2,3]
>>> a[2] = 4
>>> a
[1,2,3]
>>> a = [1,2,3]
>>> dek a[1]
>>> a
[1,3]
del a[x]는 x번째 요솟값을 삭제한다. 위에서는 a리스트에서 a[1]을 삭제했다.
del 객체
객체란 파이썬에서 사용되는 모든 자료형을 말한다.
다음처럼 슬라이싱 기법을 사용하여 리스트의 요소 여러 개를 한꺼번에 삭제할 수도 있다.
>>> a = [1,2,3,4,5]
>>> del a[2:]
>>> a
[1,2]
문자열과 마찬가지로 리스트 변수 이름 뒤에'.'를 붙여 여러 가지 리스트 관련 함수를 사용할 수 있다.
append의 사전적 의미는 '덧붙이다, 첨부하다'이다. 이 뜻을 안다면 다음 예가 바로 이해가 될 것이다.
append(x)는 리스트의 맨 마지막에 x를 추가하는 함수이다.
>>> a = [1,2,3]
>>> a.append(4)
>>> a
[1,2,3,4]
리스트 안에는 어떤 자료형도 추가할 수 있다. 다음 예제는 리스트에 다시 리스트를 추가한 결과이다.
>>> a = [1,2,3]
>>> a.append([5,6])
>>> a
[1,2,3,4,[5,6]]
sort 함수는 리스트의 요소를 순서대로 정렬해 준다.
>>> a = [1,4,3,2]
>>> a.sort()
>>> a
[1,2,3,4]
문자 역시 알파벳 순서로 정렬할 수 있다.
>>> a = ['a', 'c', 'b']
>>> a.sort()
>>> a
['a', 'b', 'c']
reverse 함수는 리스트를 역순으로 뒤집어 준다. 이때 리스트 요소들을 순서대로 정렬한 다음 다시 역순으로 정렬하는 것이 아니라 현재의 리스트를 그대로 거꾸로 뒤집는다.
>>> a = ['a', 'c', 'b']
>>> a.reverse()
>>> a
['b', 'c', 'a']
index(x) 함수는 리스트에 x 값이 있으면 x의 인덱스 값(위칫값)을 리턴한다.
>>> a = [1,2,3]
>>> a.index(3)
2
>>> a.index(2)
1
insert(a,b)는 리스트의 a번째 위치에 b를 삽입하는 함수이다.
>>> a = [1,2,3]
>>> a.insert(0,4)
>>> a
[4,1,2,3]
>>> a.insert(3, 5)
>>> a
[4, 1, 2, 5, 3]
remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수이다.
>>> a = [1,2,3,1,2,3]
>>> a.remove(3)
>>> a
[1,2,1,2,3]
>>> a.remove(3)
>>> a
[1, 2, 1, 2]
pop()은 리스트의 맨 마지막 요소를 리턴하고 그 요소는 삭제한다.
>>> a = [1, 2, 3]
>>> a.pop()
3
>>> a
[1, 2]
a 리스트를 다시 보면 [1, 2, 3]에서 3을 끄집어 내고 최종적으로 [1, 2]만 남는 것을 확인할 수 있다.
pop(x)는 리스트의 x번째 요소를 리턴하고 그 요소는 삭제한다.
>>> a = [1, 2, 3]
>>> a.pop(1)
2
>>> a
[1, 3]
count(x)는 리스트 안에 x가 몇 개 있는지 조사하여 그 개수를 리턴하는 함수이다.
>>> a = [1,2,3,1]
>>> a.count(1)
2
extend(x)에서 x에는 리스트만 올 수 있으며 원래의 a 리스트에 x 리스트를 더하게 된다.
>>> a = [1, 2, 3]
>>> a.extend([4, 5])
>>> a
[1, 2, 3, 4, 5]
>>> b = [6, 7]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6, 7]
a += [4, 5]
와 동일하다.튜플(tuple)은 몇 가지 점을 제외하곤 리스트와 거의 비슷하며 리스트와 다른 점은 다음과 같다.
- 리스트는 [], 튜플은()으로 둘러싼다.
- 리스트는 요솟값의 생성, 삭제, 수정이 가능하지만, 튜플은 요솟값을 바꿀 수 없다.
튜플은 다음과 같이 여러 가지 모습으로 생성할 수 있다.
t1 = ()
t2 = (1,)
t3 = (1,2,3)
t4 = 1, 2, 3
t5 = ('a', 'b', ('ab', 'cd'))
모습은 리스트와 거의 비슷하지만, 튜플에서는 리스트와 다른 2가지 차이점을 찾아볼 수 있다.
t2 = (1,)
처럼 단지 1개의 요소만을 가질 때는 요소 뒤에 쉼표(,)를 반드시 붙여야 하고
t4 = 1, 2, 3
처럼 소괄호(())를 생략해도 된다는 점이다.
얼핏 보면 튜플과 리스트는 비슷한 역할을 하지만, 프로그래밍을 할 때 튜플과 리스트는 구별해서 사용하는 것이 유리하다.
튜플과 리스트의 가장 큰 차이는 요솟값을 변화시킬 수 있는지의 여부이다.
즉, 리스트의 요솟값은 변화가 가능하고 튜플의 요솟값은 변화가 불가능하다.
따라서 프로그램이 실행되는 동안 요솟값이 항상 변하지 않기를 바란다거나 값이 바뀔까 걱정하고 싶지 않다면 주저하지 말고 튜플을 사용해야 한다.
이와 반대로 수시로 그 값을 변화시켜야할 경우라면 리스트를 사용해야 한다.
실제 프로그램에서는 값이 변경되는 형태의 변수가 훨씬 많기 때문에 평균적으로 튜플보다 리스트르 더 많이 사용한다.
앞에서 설명했듯이 튜플의 요솟값은 한 번 정하면 지우거나 변경할 수 없다.
다음에 소개하는 두 예를 살펴보면 무슨 말인지 알 수 있을 것이다!
>>> t1 = (1, 2, 'a', 'b')
>>> del t1[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion
>>> t1 = (1, 2, 'a', 'b')
>>> t1[0] = 'c'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
튜플은 요솟값을 변화시킬 수 없다는 점만 제외하면 리스트와 완전히 동일하므로 간단하게만 살펴보자.
다음 예제는 서로 연관되어 있으므로 차례대로 수행 해보자!
>>> t1 = (1,2,'a','b')
>>>t1[0]
1
>>>t1[3]
'b'
>>> t1 = (1,2,'a','b')
>>> t1[1:]
(2,'a','b')
>>> t1 = (1, 2, 'a', 'b')
>>> t2 = (3, 4)
>>> t3 = t1 + t2
>>> t3
(1, 2, 'a', 'b', 3, 4)
>>> t2 = (3, 4)
>>> t3 = t2 * 3
>>> t3
(3, 4, 3, 4, 3, 4)
>>> t1 = (1, 2, 'a', 'b')
>>> len(t1)
4
튜플은 요솟값을 변경할수 없기 때문에 sort, insert, remove, pop과 같은 내장 함수가 없다.
딕셔너리는 '연관 배열(associative array)’또는 ‘해시(hash)’라고 한다.
딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다.
{Key1: Value1, Key2: Value2, Key3: Value3, ...}
Key와 Value의 쌍 여러 개가 {}로 둘러싸여 있다.
각각의 요소는 Key:Value 형태로 이루어져 있고 쉼표(,)로 구분되어 있다.
다음 딕셔너리의 예를 살펴보자.
>>> dic = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
key | value |
---|---|
name | pey |
phone | 010-9999-1234 |
birth | 1118 |
>>> a = {1:'hi'}
>>> a = {'a':[1,2,3]}
>>> a = {1: 'a'}
>>> a[2] = 'b'
>>> a
{1: 'a', 2: 'b'}
>>> a['name'] = 'pey'
>>> a
{1: 'a', 2: 'b', 'name': 'pey'}
>>> a[3] = [1, 2, 3]
>>> a
{1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}
>>> del a[1]
>>> a
{2: 'b', 'name': 'pey', 3: [1, 2, 3]}
del a[key]
를 입력하면 지정한 Key에 해당하는 {Key: Value} 쌍이 삭제된다.>>> grade = {'pey': 10, 'julliet': 99}
>>> grade['pey']
10
>>> grade['julliet']
99
grade['pey']
를 사용한 것처럼 어떤 Key의 Value를 얻기 위해서는 '딕셔너리변수이름[Key]'를 사용해야 한다.>>> a = {1:'a', 1:'b'}
>>> a
{1: 'b'}
>>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])
>>> for k in a.keys():
... print(k)
...
name
phone
birth
- print(k)를 입력할 때 들여쓰기를 하지 않으면 오류가 발생하므로 주의하자.
>>> list(a.keys())
['name', 'phone', 'birth']
>>> a.values()
dict_values(['pey', '010-9999-1234', '1118'])
>>> a.items()
dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')])
>>> a.clear()
>>> a
{}
빈 리스트를 [], 빈 튜플을 ()로 표현하는 것과 마찬가지로 빈 딕셔너리도 {}로 표현한다.
>>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.get('name')
'pey'
>>> a.get('phone')
'010-9999-1234'
>>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
>>> print(a.get('nokey'))
None
>>> print(a['nokey’])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'nokey'
>>> a.get('nokey', 'foo')
'foo'
>>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
>>> 'name' in a
True
>>> 'email' in a
False