4) 리스트 (1)

  지금까지 우리는 숫자와 문자열에 대해서 알아보았다.

하지만 이러한 것들로 프로그래밍을 하기엔 부족한 점이 많다.

  예를 들어 1부터 10까지의 숫자들 중 홀수들의 모임인 1, 3, 5, 7, 9라는 집합을 생각해 보자.

이것들을 숫자나 문자열로 표현 하기는 쉽지 않다. 파이썬에는 이러한 불편함을 해소 할 수 있는 자료형이 존재한다.

  그것이 바로 이곳에서 공부하게 될 리스트이다.

리스트를 이용하면 1, 3, 5, 7, 9라는 숫자의 모임을 다음과 같이 간단하게 표현할 수 있다.

 

>>> odd = [1,3,5,7,9]

 

  리스트를 만들 때는 위에서 보는 것과 같이 대괄호([ ])로 감싸주고 안에 들어갈 값들은 쉼표로 구분해준다.

여러가지 리스트의 생김새를 살펴보면 다음과 같다.

 

>>> 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 = list()  # a = [] 과 동일

 

리스트의 인덱싱과 슬라이싱

  리스트의 경우에도 문자열처럼 인덱싱과 슬라이싱이 가능하다. 백문이 불여일견. 말로 설명하는 것보다 직접 예를 따라해보면서 리스트의 기본 구조를 이해하는 것이 쉽다. 대화형 인터프리터로 예를 따라하며 알아보자.

 

리스트의 인덱싱

  a 변수에 [1, 2, 3] 이라는 값을 세팅한다.

 

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]

 

  리스트 역시 문자열에서처럼 인덱싱이 적용된다.

 

>>> a[0]
1

 

  a[0]는 리스트 'a'의 첫 번째 요소값을 말한다.

 

아래의 예는 리스트의 첫 번째 요소인 a[0]와 세 번째 요소인 a[2]의 값을 더해 주었다.

 

>>> a[0] + a[2]
4

 

  이것은 1 + 3 으로 해석되어서 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[-1]은 마지막 요소값인 ['a', 'b', 'c']를 나타낸다.

a[3]는 리스트 a의 네 번째 요소를 나타내기 때문에 마지막 요소를 나타내는 a[-1]과 동일한 결과값을 보여준다.

 

그렇다면 여기서 리스트 a에 포함된 ['a', 'b', 'c']라는 리스트의 'a'라는 값을 인덱싱을 이용하여 끄집어 낼 수 있는 방법은 없을까?

  다음의 예를 보도록 하자.

 

>>> a[-1][0]
'a'

 

  위처럼 하면 'a'를 끄집어 낼 수가 있다.

a[-1]은 ['a', 'b', 'c']이고 다시 이것의 첫 번째 요소를 불러오기 위해서 [0]을 붙여준 것이다.

아래의 예도 역시 마찬가지 경우이므로 이해가 될 것이다.

 

>>> 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의 세 번째 요소인 리스트['a', 'b', ['Life', 'is']]의 세 번째 요소인 리스트 ['Life', 'is']의 첫 번째 요소를 말하는 것이다.

이렇듯 리스트를 중첩해서 쓰면 혼란스럽기 때문에 자주 사용되지는 않지만 알아두는 것이 좋을 것이다.

 

리스트의 슬라이싱 알아보기

 

  문자열에서와 마찬가지로 리스트에서도 슬라이싱 기법이 적용된다.

슬라이싱이라는 것은 “나눈다”라는 뜻이라고 했었다.

자, 그럼 리스트의 슬라이싱에 대해서 살펴보도록 하자.

 

>>> 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]

 

  b라는 변수는 리스트 a의 처음 요소부터 2번째 요소까지를 나타내는 리스트이다.

여기서는 a[2] 값인 '3'이 포함되지 않는다.

c라는 변수는 리스트 3번째 요소부터 끝까지를 나타내는 리스트이다.

  리스트가 포함된 리스트역시 똑같이 적용된다.

 

>>> 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[0]에서 a[2]직전까지의 값 즉, ['a', 'b']를 나타내는 리스트가 된다.

 

리스트를 더하고(+) 반복하기(*)

 

  리스트 역시 + 기호를 이용해서 더할 수가 있고 * 기호를 이용해서 반복을 할 수가 있다.

문자열과 마찬가지로 리스트에서도 되는지 한번 직접 확인해 보도록 하자.

 

예 1) 리스트 합치기

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]

 

  두 개의 리스트를 ‘+’ 기호를 이용해 합치는 방법이다. 리스트 사이에서 ‘+’ 기호는 두 개의 리스트를 합치는 기능을 한다.

문자열에서 "abc" + "def" = "abcdef"가 되는 것과 같은 이치이다.

 

예 2) 리스트 반복

>>> a = [1, 2, 3]
>>> a * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

 

  위에서 보듯이 [1, 2, 3]이란 리스트가 세 번 반복되어 새로운 리스트를 만들어 내는 것을 볼 수 있다.

문자열에서 "abc" * 3 = "abcabcabc" 가 되는 것과 같은 이치이다.

 

리스트의 수정 변경과 삭제

  참고 - 다음의 예들은 서로 연관되어 있으므로 따로따로 실행해 보지 말고 예 1부터 예 4까지 차례대로 진행해 나가야 한다.

 

예 1) 리스트 수정1

>>> a = [1, 2, 3]
>>> a[2] = 4
>>> a
[1, 2, 4]

 

  a[2]의 요소값 '3'을 '4'로 바꾸었다.

 

예 2) 리스트 수정2

>>> a[1:2]
[2]
>>> a[1:2] = ['a', 'b', 'c']
>>> a
[1, 'a', 'b', 'c', 4]

 

  a[1:2] 는 a[1]부터 a[2]까지를 말하는데 a[2]를 포함하지 않는다고 했으므로 a = [1, 2, 4]에서 2값만을 말한다.

즉, a[1:2]를 ['a', 'b', 'c']로 바꾸었으므로 a 리스트에서 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]라는 값으로 변하게 된다.

 

      예 3) 리스트 요소 삭제1

>>> a[1:3] = []
>>> a
[1, 'c', 4]

 

    지금까지의 리스트 a의 값은 [1, 'a', 'b', 'c', 4]였다.

여기서 a[1:3]은 a의 인덱스 1부터 3까지(1<=a<3) 즉, a[1], a[2]를 의미하므로 a[1:3] 은 ['a', 'b']이다.

그런데 위의 예에서 보듯이 a[1:3]을 []으로 바꾸어 주었기 때문에 a 는 a에서 ['a', 'b']가 사라진 [1, 'c', 4]가 되는 것이다.

 

    예 4) 리스트 요소 삭제 2

>>> a
[1, 'c', 4]
>>> del a[1]
>>> a
[1, 4]

 

   del a[x]는 x번째 요소값을 삭제한다. del 함수는 파이썬이 자체적으로 가지고 있는 내장 함수로 다음과 같이 사용되어 진다.

  del 객체

    (참고 - 객체란 파이썬에서 사용되는 모든 자료형을 말한다.)

    del a[x:y]는 x번째부터 y번째 요소 사이의 값을 삭제한다. 예 4에서는 a[1]을 삭제하는 방법을 보여준다.

 

[참고] 초보가 범하기 쉬운 리스트 연산 오류
우선 다음과 같은 예를 먼저 만들어보자.

>>>a = [1, 2, 3]
>>>a[2] + "hi"
Traceback (innermost last):
File "", line 1, in ?
a[2] + "hi"
TypeError: number coercion failed
TypeError 에러가 발생했다. 에러의 원인은 무엇일까?

a[2]는 3이라는 정수인데 "hi"는 문자열이다. 
두 값(정수와 문자열)을 더한다는 것은 상식적으로 맞지 않는 방법이다. 
그래서 Type 에러가 발생하는 것이다. 숫자와 문자열을 더할 수는 없다.

만약 숫자와 문자열을 더해서 '3hi'처럼 만들고 싶다면 숫자 3을 문자 '3'으로 바꾸어 주어야 한다.

다음과 같이 할 수 있다.
>>>str(a[2]) + "hi"

str 함수로 정수를 문자열로 바꾸어 주는 방법이다.