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으로 나눈 나머지
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 |
댓글