티스토리 뷰
리스트 기본 사용법
리스트는 일련의 원소들이 순서를 갖고 모여있는 집합을 의미한다. 다른 언어에서는 "배열(Array)"이라 불리는 구조와 비슷하며, 다음의 특징들을 가진다.
- 리스트의 원소들은 다양한 타입일 수 있다. 즉, 하나의 리스트에 정수와 문자열이 모두 원소로 들어갈 수 있다.
- 리스트는 크기가 고정되지 않는다. 원소를 추가/제거 혹은 변경하는 것이 가능하다.
리스트는 파이썬에서 가장 대표적이며, 기본적인 자료구조이다. 리스트의 특성을 이해하고 리스트를 다루는 방법에 익숙해지는 것은 매우 중요하며, 리스트를 잘 다룰 수 있도록 훈련하면 파이썬의 여러 장점들을 듬뿍 누릴 수 잇다.
리스트 만들기
리스트 리터럴
리스트는 콤마로 구분되는 일련의 값이나 변수들을 대괄호로 둘러싸는 것으로 만들 수 있다.
-
[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
- 리눅스
- mutability
- 리스트
- locals()
- 표준입력
- short_circuit
- sorted
- Python
- 반복자
- 함수형
- 파일입출력
- globals()
- dict
- 파이썬
- 이중리스트를 사용하지 않기
- iterable
- ipython-notebook
- 정렬기준
- 변경가능
- 정렬키
- jupyter-notebook
- 복수기준정렬
- leapYear
- 우분투
- python list
- 파이썬노트북
- 사전
- Lambda
- 단어 빈도수
- 튜플언패킹
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |