본문 바로가기
Tech-Pyhton

[Python] List Comprehension

by redcrow 2019. 3. 27.

1. 리스트 컴프리헨션(List Comprehension)


List comprehension 이란 기존의 list 로 새로운 list 를 생성하는 구문


List 뿐만 아니라 Tuple과 Dictionary도 유사하게 적용가능하다.


단 , list가 [] 로 list comprehension을 생성한것처럼  Tuple을 아래처럼 생성해도 tuple1은 generator type이라 변환이 필요하다.

그래서 tuple2처럼 사용. Dictionary와 이건 나중에 다시 .. 


tuple1 = (i for i in range(10))


tuple2 = tuple( i for i in range(10))


# list1 과 list2는 동일한 표현


>>> list1 = [i for i in range(10)]

>>> list1

  

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


>>> list2 = list(i for i in range(10))

>>> list2

  

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


###########################

# list3 처럼 for loop의 값을 변형하여 list에 저장할 수도 있음


>>> list3 = [i * 2 for i in range(10)]

  

>>> list3

  

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


# 리스트컴프리헨션에 조건추가하기


>>> list4 = [i * 2 for i in range(10) if i % 3 == 0 ]   # 0~10 숫자중 3으로 나눠서 나머지가 0인 숫자를 2배한 list

                                                                    # [0,3,6,9] 가 조건으로 걸리고 그 2배인 [0,6,12,18]이 최종

>>> list4

  

[0, 6, 12, 18]


1) List comprehension 기초


>>> [ x for x in range(10)]

  

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


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

  

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


>>> [(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)]


>>> [(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)]

  

[[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25]]


>>> vec = [[1,2,3], [4,5,6], [7,8,9]]

>>> [num for elem in vec for num in elem]

[1, 2, 3, 4, 5, 6, 7, 8, 9]


2) Nested List Comprehension -1


>>> matrix = [

[1, 2, 3, 4],

[5, 6, 7, 8],

[9, 10, 11, 12]

]


>>> list(zip(*matrix))

  

[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]


>>> list(map(list, zip(*matrix)))

  

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]


3) Nested List Comprehension -2


>>> matrix  = [[1, 2, 3], [4, 5, 6] , [7, 8, 9]]


>>> [ [ x ** 2 for x in row ]  for row in matrix]   # 모든 값을 제곱하기

     

[[1, 4, 9], [16, 25, 36], [49, 64, 81]]


>>> [ x for row in matrix for x in row]  # 1차원으로 변경

     

[1, 2, 3, 4, 5, 6, 7, 8, 9]


4) Nested List Comprehension - 3


>>> input_list = [ [77,78,12,30]

          ,[33,78,9,7]

          ,[5,71,84,25]

          ,[9,37,0,27]

        ]

>>> [ [i%10 for i in row ] for row in input_list]    # 모든 원소의 10으로 나눈 나머지

[[7, 8, 2, 0], [3, 8, 9, 7], [5, 1, 4, 5], [9, 7, 0, 7]]


>>> [ sorted(row) for row in input_list]             # 각 row를 정렬

[[12, 30, 77, 78], [7, 9, 33, 78], [5, 25, 71, 84], [0, 9, 27, 37]]


>>> [ column[1] for column in input_list]   # 특정열 추출 (예제는 2번째 열)

[78, 78, 71, 37]


>>> sorted(input_list, key=lambda x:x[1])   # 특정열을 기준으로 정렬 (예제는 2번째 열)

[[9, 37, 0, 27], [5, 71, 84, 25], [77, 78, 12, 30], [33, 78, 9, 7]]


5) Lamda 함수 사용


>>> list (map( lambda x,y : x+y, range(10), range(10)))

  

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


>>> list ( sum(x) for x in zip(range(10), range(10)))

  

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


# 2차원 배열 (nested list)에서 세가지 조건이상의  labmda expression 사용


numData = [[5,7,-5,100,73]

                 ,[35,23,4,190,33]

                 ,[49,85,662,39,81]

                 ,[124,-59,86,46,52]

                 ,[27,7,8,33,-56]]


# 각 원소가 0보다 작으면 0, 100보다 크면 100으로 나눈 나머지

retData = [[(lambda x: 0 if x < 0 else ( x%100 if x >100  else x))(x) for x in row] for row in numData]



6) zip 함수 사용 예제 (Matrix 회전)


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

           ,[4,5,6]

           ,[7,8,9]]

>>> r_matrix = list(list(x)[::-1] for x in zip(*matrix))

>>> r_matrix

[[7, 4, 1], [8, 5, 2], [9, 6, 3]]


>>> l_matrix = list(list(x) for x in zip(*matrix))[::-1]

>>> l_matrix

[[3, 6, 9], [2, 5, 8], [1, 4, 7]]


'Tech-Pyhton' 카테고리의 다른 글

[Python] Dictionary  (0) 2019.03.27
[Python] Map, Filter, Zip  (0) 2019.03.27
[Python] collections  (0) 2019.03.27
[Python] 유용한 파이썬 기능  (0) 2019.03.10
Python 자료형 SORT [List, Tuple, Dictionary]  (0) 2019.03.06

댓글