- 리스트를 만들 때는 대괄호([ ])로 감싸 주고 각 요솟값은 쉼표(,)로 구분해 준다.
# 비어 있는 리스트는 a = list()로 생성할 수도 있다.
a = []
b = [1, 2, 3]
c = ['Life', 'is', 'too', 'short']
d = [1, 2, 'Life', 'is']
e = [1, 2, ['Life', 'is']]
- 리스트는 a처럼 아무것도 포함하지 않아 비어 있는 리스트([ ])일 수도 있고 b처럼 숫자를 요솟값으로 가질 수도 있고 c처럼 문자열을 요솟값으로 가질 수도 있다. 또한 d처럼 숫자와 문자열을 함께 요솟값으로 가질 수도 있으며 e처럼 리스트 자체를 요솟값으로 가질 수도 있다. 즉 리스트 안에는 어떠한 자료형도 포함시킬 수 있다.
- 리스트도 문자열처럼 인덱싱과 슬라이싱이 가능하다.
a = [1, 2, 3]
print(a[0])
print(a[0] + a[2])
print(a[-1])
1
4
3
- 위와 같이 리스트에서도 0번이 첫번째 데이터를 의미하고 -1 역시 리스트의 마지막 값을 출력한다.
a = [1, 2, 3, ['a', 'b', 'c']]
print(a[-1])
print(a[3])
print(a[3][0])
print(a[3][1])
['a', 'b', 'c']
['a', 'b', 'c']
a
b
- 그리고 이렇게 리스트안에 리스트가 존재할 수 있다. 리스트 a에 포함된 ['a', 'b', 'c'] 리스트의 값에 접근하려면 []를 한번 더 사용하면 된다.
a = [1, 2, ['a', 'b', ['Life', 'is']]]
print(a[2][2][0])
Life
- 또한, 위의 경우처럼 삼중 리스트에서 인덱싱하는 경우도 있다. Life를 출력하고자 한다면, 리스트 a의 세 번째 요소인 리스트 ['a', 'b', ['Life', 'is']]에서 세 번째 요소인 리스트 ['Life', 'is']의 첫 번째 요소를 가져와주면 된다.
- 문자열과 마찬가지로 리스트에서도 슬라이싱 기법을 적용할 수 있다. 슬라이싱은 ‘나눈다’는 뜻이라고 했다.
a = [1, 2, 3, 4, 5]
b = a[:2]
c = a[2:]
print(b)
print(c)
[1, 2]
[3, 4, 5]
- 리스트 슬라이싱도 문자열에서 했던 것과 사용법이 완전히 동일하다.
a = [1, 2, 3, ['a', 'b', 'c'], 4, 5]
print(a[2:5])
print(a[3][:2])
[3, ['a', 'b', 'c'], 4]
['a', 'b']
- 이렇게 리스트가 중첩된 경우에도 슬라이싱 방법이 동일하게 적용된다.
- 리스트 역시 + 기호를 사용해서 더할 수 있고 * 기호를 사용해서 반복할 수 있다.
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)
[1, 2, 3, 4, 5, 6]
- 리스트 사이에 + 기호를 사용하면, 1개의 리스트에 모든 요소들을 합쳐준다.
a = [1, 2, 3]
print(a * 3)
[1, 2, 3, 1, 2, 3, 1, 2, 3]
- 리스트에 *를 사용하면, 1개의 리스트에 해당 리스트 데이터를 반복한 요소들로 만들어준다.
a = [1, 2, 3]
print(len(a))
3
-
리스트의 데이터 개수를 구할 때는 len() 함수를 사용하면 된다.
-
초보자가 범하기 쉬운 리스트 연산 오류
a = [1, 2, 3]
print(a[2] + "hi")
TypeError: unsupported operand type(s) for +: 'int' and 'str'
- 위의 코드의 결과가 a[2]의 값인 3과 문자열 hi가 더해져서 3hi가 출력될 것이라고 생각할 수 있지만, 형 오류(TypeError)가 발생했다.
- a[2]에 저장된 값은 3이라는 정수인데 "hi"는 문자열이다. 정수와 문자열은 당연히 서로 더할 수 없기 때문에 형 오류가 발생한 것이다.
- 만약 숫자와 문자열을 더해서 '3hi'처럼 만들고 싶다면 숫자 3을 문자 '3'으로 바꾸어 주어야 한다. 즉, 문자열끼리만 더하기가 가능하다.
a = [1, 2, 3]
print(str(a[2]) + "hi")
3hi
- 정수나 실수를 문자열의 형태로 바꾸어 주는 파이썬의 내장 함수인 str 함수를 사용하면 된다.
a = [1, 2, 3]
a[2] = 4
print(a)
[1, 2, 4]
- 이렇게 a[2]의 요솟값 3을 4로 바꿀 수 있다.
a = [1, 2, 3]
del a[1]
print(a)
[1, 3]
- del a[x]는 x번째 요솟값을 삭제한다. 여기에서는 a 리스트에서 a[1]을 삭제하는 방법을 보여준다. del 함수는 파이썬이 자체적으로 가지고 있는 삭제 함수이며 다음과 같이 사용한다.
del 객체
- 객체란 파이썬에서 사용되는 모든 자료형을 말한다.
a = [1, 2, 3, 4, 5]
del a[2:]
print(a)
[1, 2]
- 그리고 이런식으로 슬라이싱을 사용해서 여러 개의 데이터를 한꺼번에 삭제할 수도 있다.
- 문자열과 마찬가지로 리스트 변수 이름 뒤에 '.'를 붙여서 여러 가지 리스트 관련 함수를 사용할 수 있다.
a = [1, 2, 3]
a.append(4)
print(a)
[1, 2, 3, 4]
- append(x)는 리스트의 맨 마지막에 x를 추가하는 함수이다.
a = [1, 4, 3, 2]
a.sort()
print(a)
[1, 2, 3, 4]
- sort 함수는 리스트의 요소를 오름차순 순서대로 정렬해준다.
a = ['a', 'c', 'b']
a.sort()
print(a)
['a', 'b', 'c']
- sort 함수는 문자도 알파벳 순서로 정렬해준다.
a = ['a', 'c', 'b']
a.reverse()
print(a)
['b', 'c', 'a']
- reverse 함수는 리스트를 역순으로 뒤집어 준다. 현재의 리스트를 그대로 거꾸로 뒤집는다.
a = [1, 2, 3]
print(a.index(3))
print(a.index(1))
print(a.index(0))
2
0
ValueError: 0 is not in list
- index 함수는 리스트에 x 값이 있으면 x의 위치 인덱스 값을 돌려준다. 리스트에 없는 값을 입력하면 에러가 발생한다.
a = [1, 2, 3]
a.insert(0, 4)
print(a)
[4, 1, 2, 3]
- insert(a, b) 함수는 리스트에 a번째 위치에 b를 삽입하는 함수이다.
a = [1, 2, 3, 1, 2, 3]
a.remove(3)
print(a)
[1, 2, 1, 2, 3]
- remove(x) 함수는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수이다.
a = [1, 2, 3]
print(a.pop())
print(a)
3
[1, 2]
- pop() 함수는 리스트의 맨 마지막 요소를 끄집어내고 리스트에서는 삭제하는 함수이다.
a = [1, 2, 3]
print(a.pop(1))
print(a)
2
[1, 3]
- pop(x) 함수는 리스트의 x번째 요소를 끄집어내고 그 요소는 삭제한다.
a = [1, 2, 3, 1]
print(a.count(1))
2
- count(x) 함수는 리스트 안에 x가 몇 개 있는지 조사하여 그 개수를 돌려주는 함수이다.
a = [1, 2, 3]
a.extend([4, 5])
print(a)
[1, 2, 3, 4, 5]
- extend(x) 함수에서 x에는 리스트만 올 수 있으며 원래의 a 리스트에 x 리스트를 더하게 된다. a.extend([4, 5])는 a += [4, 5]와 동일하다.
- 튜플(tuple)은 몇 가지 점을 제외하곤 리스트와 거의 비슷하며 리스트와 다른 점은 다음과 같다.
- 리스트는 [ ]으로 둘러싸지만 튜플은 ( )으로 둘러싼다.
- 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없다.
t1 = ()
t2 = (1, )
t3 = (1, 2, 3)
t4 = 1, 2, 3
t5 = ('a', 'b', ('ab', 'cd'))
-
위의 코드들은 튜플의 다양한 형태를 보여준다.
- 중요한 점은, 튜플에서는 t2 = (1,)처럼 단지 1개의 요소만을 가질 때는 요소 뒤에 콤마(,)를 반드시 붙여야 한다.
- 그리고 t4 = 1, 2, 3처럼 괄호( )를 생략해도 무방하다는 점이다.
-
튜플과 리스트의 가장 큰 차이는 값을 변화시킬 수 있는가 여부이다. 즉 리스트의 항목 값은 변화가 가능하고 튜플의 항목 값은 변화가 불가능하다. 따라서 프로그램이 실행되는 동안 그 값이 항상 변하지 않기를 바란다거나 값이 바뀔까 걱정하고 싶지 않다면 주저하지 말고 튜플을 사용해야 한다. 이와는 반대로 수시로 그 값을 변화시켜야할 경우라면 리스트를 사용해야 한다. 실제 프로그램에서는 값이 변경되는 형태의 변수가 훨씬 많기 때문에 평균적으로 튜플보다는 리스트를 더 많이 사용한다.
t1 = (1, 2, 'a', 'b')
del t1[0]
TypeError: 'tuple' object doesn't support item deletion
- 튜플의 요소를 리스트처럼 del 함수로 지우려고 한 예이다. 튜플은 요소를 지우는 행위가 지원되지 않는다는 메시지를 확인할 수 있다.
t1 = (1, 2, 'a', 'b')
t1[0] = 'c'
TypeError: 'tuple' object does not support item assignment
- 마찬가지로 튜플의 요솟값을 변경하려고 해도 오류가 발생하는 것을 확인할 수 있다.
- 튜플은 값을 변화시킬 수 없다는 점만 제외하면 리스트와 완전히 동일하므로 인덱싱과 슬라이싱이 가능하다.
t1 = (1, 2, 'a', 'b')
print(t1[0])
1
t1 = (1, 2, 'a', 'b')
print(t1[1:])
(2, 'a', 'b')
- 이렇게 인덱싱과 슬라이싱이 가능하다.
t1 = (1, 2, 'a', 'b')
t2 = (3, 4)
print(t1 + t2)
(1, 2, 'a', 'b', 3, 4)
- 이렇게 + 연산자를 사용해서 2개의 튜플을 합칠 수 있다. 단, 이때 만들어지는 + 연산자의 결과는 t1, t2 값이 변경되는 것이 아니라(튜플은 그 값을 변경할 수 없다) 새로운 튜플이 생성되고 그 값이 다른 변수에 대입되는 것임에 유념하자.
t2 = (3, 4)
print(t2 * 3)
(3, 4, 3, 4, 3, 4)
- 리스트와 마찬가지로 * 연산자도 사용할 수 있다.
t1 = (1, 2, 'a', 'b')
print(len(t1))
4
- len 함수를 사용해서 튜플의 길이를 구할 수 있다.