레이블이 comprehension인 게시물을 표시합니다. 모든 게시물 표시
레이블이 comprehension인 게시물을 표시합니다. 모든 게시물 표시

2015년 5월 25일 월요일

파이썬의 리스트(list) 생성

 리스트는 여러 개의 객체를 하나로 묶는 데이터 형이다. (엄밀히 말하면 mutable sequence 형임) 기본적으로 대괄호 [..]를 이용하여 묶고자 하는 데이터들을 콤마(,)로 구별하여 나열한다. 보통은 같은 형의 데이터를 묶어서 많이 사용하지만 리스트의 요소는 서로 다른 데이터 형일 수 있다.

>>> la = [11, 22, 33] # 리스트를 생성하여 la 에 저장한다.
>>> lb = [‘life’, ‘is’, ‘short’] # 문자열의 리스트
>>> lc = [True, ‘hi’, 33.4, 2-3j]
>>> ld = [] # empty list를 생성하여 lc에 저장

이 예제와 같이 리스트의 요소는 어떠한 자료형이라도 가능하다. 리스트 안에 리스트가 오는 것도 얼마든지 가능하다.

>>> le = [ [11,22], [33, 44, 55] ]

이것을 중첩된 리스트라고 한다.

리스트를 만드는 또 다른 방법은 list comprehension 을 이용하는 것이다. 예를 들어서 제곱 수의 리스트틀 만든다고 가정하자. 다음과 같이 for 문을 이용할 수 도 있을 것이다.

>>> squares = []
>>> for x in range(10):
...    squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

하지만 이 방법은 변수 x가 생성되고 for 문이 종료된 후에도 변수 x 가 메모리에 남아 있게 된다. 좀 더 깔끔한 방법은 다음과 같이 map()과 익명 함수를 이용하는 것이다.

>>> squares = list(map(lambda x: x**2, range(10)))

이것과 완전히 동일한 방법이 바로 다음과같은 list comprehension 이고 훨씬 더 간결하고 가독성이 높다.

>>> squares = [x**2 for x in range(10)]

일반적으로 다음과 같이 구성된다.

[ 표현식 for문 (for 문 | if 문)* ]

예를 들어서 두 리스트 요소 중 다른 것들로만 조합하는 리스트는 다음과 같다.

>>> [(x,y) for x in [1,2,3] for y in [3,1,4] if x!=y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

이것은 다음 프로그램과 동일한 동작을 수행한다.

>>> combs = []
>>> for x in [1,2,3]:
...    for y in [3,1,4]:
...        if x != y:
...            combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

두 가지 경우에서 for 문과 if 문의 순서가 같다는 것을 알 수 있다.
표현식이 튜플일 경우 반드시 괄호로 묶어야 한다.

>>> [(x,x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

만약 다음과 같이 괄호를 생략하면 에러가 발생한다.

>>> [ x,x**2  for x in range(6)] # 에러 발생

여기서 소개한 내용이 리스트를 생성하는 기본적인 방법들이다.