PYTHON.
02. 파이썬의 프로그래밍의 기초, 자료형.
02-3 리스트 자료형PYTHON. 02
* 리스트는 어떻게 만들고 사용할까?
>>> a = [ ] // 비어 있는 리스트는 a = list()로 생성할 수도 있다.
>>> b = [1, 2, 3]
>>> c = ['Life', 'is', 'too', 'short']
>>> d = [1, 2, 'Life', 'is']
>>> e = [1, 2, ['Life', 'is']] // 리스트 자체를 요소 값으로 가질 수도 있다.
리스트 안에는 어떠한 자료형도 포함시킬 수 있다.
리스트의 인덱싱과 슬라이싱
리스트의 인덱싱
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a[0]
1
>>> a[0] + a[2]
4
>>> a[-1]
3
>>> a[-2]
2
>>> a = [1, 2, 3, ['a', 'b', 'c']]
>>> a[0]
1
>>> a[-1]
['a', 'b', 'c']
>>> a[3]
['a', 'b', 'c']
>>> a[-1][0]
'a'
>>> a[-1][1]
'b'
>>> a[-1][2]
'c'
[삼중 리스트에서 인덱싱하기]
>>> a = [1, 2, ['a', 'b', ['Life', 'is']]]
>>> 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[3]은 ['a', 'b', 'c']를 나타낸다. 따라서 a[3][:2]는 ['a', 'b', 'c']의 첫 번째 요소부터 세 번째 요소 직전까지의 값, 즉 ['a', 'b']를 나타내는 리스트가 된다.
리스트 연산자
1) 리스트 더하기(+)
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
2) 리스트 반복하기(*
)
>>> a = [1, 2, 3]
>>> a * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
[초보자가 범하기 쉬운 리스트 연산 오류]
다음과 같은 소스 코드를 입력했을 때 결과값은 어떻게 나올까?
>>>a = [1, 2, 3]
>>>a[2] + "hi"
a[2]의 값인 3과 문자열 hi가 더해져서 3hi가 출력될 것이라고 생각할 수 있다. 하지만 다음의 결과를 보자. 형 오류(TypeError)가 발생했다. 오류의 원인은 무엇일까?
Traceback (innermost last):
File "", line 1, in ?
a[2] + "hi"
TypeError: number coercion failed
a[2]에 저장된 값은 3이라는 정수인데 "hi"는 문자열이다. 정수와 문자열은 당연히 서로 더할 수 없기 때문에 형 오류가 발생한 것이다.
만약 숫자와 문자열을 더해서 '3hi'처럼 만들고 싶다면 숫자 3을 문자 '3'으로 바꾸어 주어야 한다. 다음과 같이 할 수 있다.
>>>str(a[2]) + "hi"
str()은 정수나 실수를 문자열의 형태로 바꾸어 주는 파이썬의 내장 함수이다.
리스트의 수정, 변경과 삭제
1. 리스트에서 하나의 값 수정하기
>>> a = [1, 2, 3]
>>> a[2] = 4
>>> a
[1, 2, 4]
2. 리스트에서 연속된 범위의 값 수정하기
>>> a[1:2]
[2]
>>> a[1:2] = ['a', 'b', 'c']
>>> a
[1, 'a', 'b', 'c', 4]
[리스트 수정할 때 주의할 점]
2번 예제에서 리스트를 a[1:2] = ['a', 'b', 'c']로 수정하는 것과 a[1] = ['a', 'b', 'c']로 수정하는 것은 전혀 다른 결과값을 갖게 되므로 주의해야 한다. a[1] = ['a', 'b', 'c']는 리스트 a의 두 번째 요소를 ['a', 'b','c']로 바꾼다는 말이고 a[1:2]는 a[1]에서 a[2] 사이의 리스트를 ['a', 'b', 'c']로 바꾼다는 말이다. 따라서 a[1] = ['a', 'b', 'c']로 수정하게 되면 위와는 달리 리스트 a가 [1, ['a', 'b', 'c'], 4]라는 값으로 변하게 된다.
>>> a[1] = ['a', 'b', 'c']
>>> a
[1, ['a', 'b', 'c'], 4]
3. [ ] 사용해 리스트 요소 삭제하기
>>> a = [1, 'a', 'b', 'c', 4]
>>> a[1:3] = [ ]
>>> a
[1, 'c', 4]
4. del 함수 사용해 리스트 요소 삭제하기
>>> a
[1, 'c', 4]
>>> del a[1]
>>> a
[1, 4]
* 리스트 관련 함수들
- 리스트에 요소 추가(append)
// append(x)는 리스트의 맨 마지막에 x를 추가시키는 함수이다.
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> a.append([5,6])
>>> a
[1, 2, 3, 4, [5, 6]]
- 리스트 정렬(sort)
// sort 함수는 리스트의 요소를 순서대로 정렬해 준다.
>>> a = [1, 4, 3, 2]
>>> a.sort()
>>> a
[1, 2, 3, 4]
>>> a = ['a', 'c', 'b'] // 문자 역시 알파벳 순서로 정렬할 수 있다.
>>> a.sort()
>>> a
['a', 'b', 'c']
- 리스트 뒤집기(reverse)
// reverse 함수는 리스트를 역순으로 뒤집어 준다
>>> a = ['a', 'c', 'b']
>>> a.reverse()
>>> a
['b', 'c', 'a']
- 위치 반환(index)
// index(x) 함수는 리스트에 x라는 값이 있으면 x의 위치값을 리턴한다.
>>> a = [1,2,3]
>>> a.index(3)
2
>>> a.index(1)
0
- 리스트에 요소 삽입(insert)
// insert(a, b)는 리스트의 a번째 위치에 b를 삽입하는 함수이다.
>>> a = [1, 2, 3]
>>> a.insert(0, 4)
[4, 1, 2, 3]
>>> a.insert(3, 5)
[4, 1, 2, 5, 3]
- 리스트 요소 제거(remove)
// remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수이다.
>>> a = [1, 2, 3, 1, 2, 3]
>>> a.remove(3)
[1, 2, 1, 2, 3]
>>> a.remove(3)
[1, 2, 1, 2]
- 리스트 요소 끄집어내기(pop)
// pop()은 리스트의 맨 마지막 요소를 돌려 주고 그 요소는 삭제하는 함수이다
>>> a = [1,2,3]
>>> a.pop()
3
>>> a
[1, 2]
// pop(x)는 리스트의 x번째 요소를 돌려 주고 그 요소는 삭제한다.
>>> a = [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
- 리스트에 포함된 요소 x의 개수 세기(count)
//
>>> a = [1,2,3,1]
>>> a.count(1)
2
- 리스트 확장(extend)
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]
리스트의 요소를 제거하는 3가지 방법
지금까지 알아본 리스트의 요소를 제거하는 방법은 총 3가지이다.
- 리스트의 remove 함수 이용하기
- 리스트의 pop 함수 이용하기
- del을 이용하기
이 3가지 방법은 결과적으로 리스트의 요소가 삭제된다는 점에서는 동일하지만 삭제에 사용되는 입력값에는 큰 차이점이 있다. 예제로 알아보자.
>>> a = [1, 2, 3, 'a', 'b', 'c']
>>> a.remove('a')
>>> a
[1, 2, 3, 'b', 'c']
1. a.remove('a')는 a 리스트의 'a'라는 요소값을 삭제한다. 즉, a.remove(x)의 x에는 인덱스가 아닌 요소값 만을 사용할 수 있다. 참고로 다음과 같이 리스트의 요소를 인덱스로 삭제하려고 하면 다음과 같은 오류가 발생한다.
>>> a.remove(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
2. pop은 remove와 반대로 요소값으로 삭제할 수는 없고 인덱스로만 삭제가 가능하다. 즉, a.pop(x)의 x에는 a리스트의 인덱스만 가능하다. 다음의 예제로 확인해 보자.
>>> a = [1, 2, 3, 'a', 'b', 'c']
>>> a.pop(4)
'b'
>>> a
[1, 2, 3, 'a', 'c']
a.pop(4)는 a리스트의 5번째 요소를 삭제한다. 단, pop함수는 삭제된 요소를 리턴받는 특징이 있다.
만약 pop 함수 사용시 인덱스가 아닌 요소값을 이용한다면 다음과 같은 오류를 만나게 될 것이다.
>>> a.pop('b')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer
3. del은 리스트의 요소를 삭제하는 함수이므로 당연히 인덱스만 가능하다.
>>> a = [1, 2, 3, 'a', 'b', 'c']
>>> del a[4]
>>> a
[1, 2, 3, 'a', 'c']
del a[4] 는 a리스트의 5번째 요소를 삭제한다는 것을 알 수 있다.
즉, 결론은 다음과 같다.
- a.remove(x) - x는 a리스트의 요소값
- a.pop(x) - x는 a리스트의 인덱스
- del a[x] - x는 a리스트의 인덱스