티스토리 뷰

반응형

리스트 기본 사용법

리스트는 일련의 원소들이 순서를 갖고 모여있는 집합을 의미한다. 다른 언어에서는 "배열(Array)"이라 불리는 구조와 비슷하며, 다음의 특징들을 가진다.

  1. 리스트의 원소들은 다양한 타입일 수 있다. 즉, 하나의 리스트에 정수와 문자열이 모두 원소로 들어갈 수 있다.
  2. 리스트는 크기가 고정되지 않는다. 원소를 추가/제거 혹은 변경하는 것이 가능하다.

리스트는 파이썬에서 가장 대표적이며, 기본적인 자료구조이다. 리스트의 특성을 이해하고 리스트를 다루는 방법에 익숙해지는 것은 매우 중요하며, 리스트를 잘 다룰 수 있도록 훈련하면 파이썬의 여러 장점들을 듬뿍 누릴 수 잇다.

리스트 만들기

리스트 리터럴

리스트는 콤마로 구분되는 일련의 값이나 변수들을 대괄호로 둘러싸는 것으로 만들 수 있다.

  • [1, 2, 3] , ['a', 'b', 'c']
  • [] : 빈 리스트

이러한 문법을 리스트 리터럴이라고 한다. 리스트를 생성하는 가장 기본적인 문법이다.

리스트 생성자 : list

list는 파이썬에서 리스트의 타입을 가리키는 예약어인 동시에 리스트를 생성하는 생성함수로서도 동작한다. 파이썬 REPL에서 help(list)를 실행해보면 list에 대한 내용을 볼 수 있다.


help(list)
Help on class list in module builtins:

class list(object)
 |  list() -> new empty list
 |  list(iterable) -> new list initialized from iterable's items
 ....

먼저 list()라고만 하면 빈 리스트가 만들어지며, list(반복자)라는 부분은 '반복자'라는 걸 괄호속에 넣어서 넘겨주면 그 내용으로 리스트를 만들어준다. 반복자에 대해서는 다음 기회에 설명하기로 하고 여기서는 리스트나, 튜플, 사전등과 같이 어떤 집합체인 동시에 그 내부의 원소들을 순회할 수 있는 데이터 타입이나 구조를 말한다고 보면 된다.

즉 집합(set)이나 튜플와 같은 반복자는 list()에 넣어서 리스트로 변환할 수 있다. 대부분의 시퀀스 계열 파이썬 타입은 타입 자신을 생성자로 써서 다른 시퀀스로부터 해당 타입을 생성할 수 있다. 예를 들어 튜플의 경우에도 tuple([1,2,3])을 통해서 (1,2,3) 이라는 튜플을 만들 수 있다.

리스트 축약

리스트 축약(List Comprehension)이라는 파이썬의 독특한 문법을 통해서도 리스트를 만들 수 있다. 이 부분 역시 뒤에가서 다시 설명하도록 하겠다.

리스트 사용하기

원소 액세스

리스트는 리스트 이름 뒤에 [i]를 써서 i 번째 원소를 액세스할 수 있다. 같은 문법으로 i 번째 원소를 다른 객체로 바꾸는 것도 가능하다. 이 때 인덱스는 0부터 시작한다.


>>> a = [1, 2, 3] # a는 원소 3개짜리 리스트
>>> a[0] # 첫번째 원소는 [0]으로 참조할 수 있다.
1
>>> a[2] # 마지막 원소는 따라서 [2]로 참조하게 된다.

원소를 액세스할 때 인덱스를 벗어난 원소를 참조하려하면 IndexError가 발생한다.


In [21]: a = [1,2,3]

In [22]: a[4]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-22-54d383a36828> in <module>()
----> 1 a[4]

IndexError: list index out of range

특이한 점은 음수를 인덱스로 사용하면 인덱스 에러가 발생하는 것이 아니라 리스트의 원소를 뒤에서 부터 참조하게 된다.


In [23]: a[-1]
Out[23]: 3

In [24]: a[-2]
Out[24]: 2

참조 문법을 이용해서 대입문을 만들면 리스트에 존재하는 원소를 변경할 수 있다.


In [25]: a
Out[25]: [1, 2, 3]

In [26]: a[1] = 4

In [27]: a[-1] = 'hello'

In [28]: a
Out[28]: [1, 4, 'hello']

슬라이스 표기

[]속에 정수값 1개를 쓰면 하나의 원소를 액세스하게 되는데, 슬라이스 표기를 사용하면 부분열을 얻을 수 있다.


In [30]: a
Out[30]: [1, 4, 7, 10, 13, 16, 19]

In [31]: a[2:4]
Out[31]: [7, 10]

위 예에서 2:4의 슬라이스 표기는 2번째 인덱스부터 4번째 인덱스 앞까지라는 의미이다. 중요한 것은 슬라이스의 끝부분 인덱스는 항상 포함되지 않는다는 것이다. 따라서 2, 3 번 인덱스에 해당하는 4, 7의 값이 리스트로 구해진다.

슬라이스 표기는 다음과 같은 패턴들이 있다.

  • start:end : 시작과 끝 범위
  • start:end:step : 시작과 끝 범위에서 step 만큼 건너뛴 값들
  • :end, :end:step : start가 0인 경우에는 생략할 수 있다.
  • start:, start::step: 마찬가지로 end가 생략된 경우에는 리스트의 끝까지를 포함한다.
  • ::, ::step : start, end를 모두 생략할 수 있다.

흥미로운 지점은 슬라이스 표기를 이용해서 한꺼번에 많은 원소를 치환할 수 있다는 것이다. 자주 쓰일 일은 별로 없지만, 알아두면 유용하게 써 먹을 곳이 가끔 있다.


In [36]: a = [1,3,4,5,7,8]

In [37]: a[2:5] = [11,12,13]

In [38]: a
Out[38]: [1, 3, 11, 12, 13, 8]
#               ^^^^^^^^^^

조작

리스트 타입은 자신을 조작할 수 있는 메소드(method)들을 기본적으로 제공하고 있다. 대화형 쉘에서 dir(list)라고 입력해보면 리스트의 여러 속성들이 주르륵 나오는데 그 중에서 __****__의 모양이 아닌 것들을 추려보면 다음과 같은 것들이 있다.

  • append : 리스트의 끝에 새 원소를 추가한다.
  • clear : 리스트의 모든 원소를 제거하고 빈 리스트가 된다.
  • copy : 리스트를 얕은 복사한 사본을 생성한다. 얕은 복사에 대해서는 다음에 설명한다.
  • count : 주어진 원소와 같은 원소의 개수를 센다.
  • extend : 주어진 연속열의 각 원소를 리스트의 끝에 추가한다.
  • index : 주어진 원소가 처음으로 나타나는 인덱스값을 구한다.
  • pop : 주어진 인덱스에 위치한 원소를 제거하여 리턴한다. 인덱스를 생략하면 마지막 원소가 제거된다.
  • remove : 주어진 원소를 제거한다. 중복된 원소가 있으면 첫번째 것만 제거한다.
  • reverse : 리스트 자신을 역순으로 재배치한다. In-place 동작으로, 리스트 자신이 변경되며 리턴되는 값은 없다.
  • sort : 리스트를 정렬한다. 정렬 기준이나 방법에 대한 몇 가지 파라미터들이 있는데, 이 부분은 다음에 설명하기로 하자.

혹은 특정 객체의 메소드들은 다음과 같은 명령으로 뽑아볼 수 있다.


a = list()
[x for x in dir(a) if not x.startswith('_') and callable(getattr(a, x))]



그외에 파이썬 기본 함수 중에서 리스트를 대상으로 쓸 수 있는 것들에는 다음과 같은 것들이 있다.

  • len : 리스트의 길이, 즉 리스트의 원소의 개수를 센다.
  • sorted : 단어 모양에 주의하자. 인자로 받은 리스트를 정렬한 사본을 생성하며, 원본 리스트는 그대로 둔다.
  • reversed : 역시 리스트를 뒤집은 사본을 생성하며, 원본 리스트는 그대로 둔다.
  • sum : 리스트의 원소들이 더할 수 있는 값인 경우, 그 합계를 구한다.
  • max, min : 리스트의 원소들에 대해서 최대값/최소값을 구한다.

그리고 중요한 map, filter, reduce가 있는데, 이 부분도 다음에 기회가 되면 설명하기로 한다. (궁금한 사람은 대화형쉘에서 help() 명령을 이용해보거나, 파이썬 document를 찾아보자.

반응형

'파이썬 how to' 카테고리의 다른 글

파이썬 사전 사용법  (0) 2017.05.19
파이썬 튜플 기초 사용법  (0) 2017.05.15
iPython 설치하는 방법  (3) 2017.05.09
맵과 필터 그리고 리스트 축약  (0) 2017.05.02
Reduce 사용법, 그리고 lambda  (0) 2017.04.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함