※ 이 글의 작성자는 SW 비전공자입니다.
※ 개인적으로 공부하고 있는 내용을 정리하고 있는 글로 잘못 된 부분이 있다면 댓글을 남겨주세요.
이전편 : 2021.05.02 - [코딩/Algorithm & 코딩테스트] - [Python/파이썬]Indent, Naming, Type hint
파이썬 알고리즘 인터뷰 책을 보고 쓰는 포스팅 2편. 이번편에서는 map, filter, list comprehesion에 대해 정리한다.
map, filter를 알기 전에 lambda를 먼저 이해해야해서 정리해보았다.
1. lambda
-. 이름 없는 함수 정의(def와 다름)
-. 람다함수의 장점은 코드가 간결하고 메모리가 절약 된다고 함(메모리가 절약되는 부분은 나중에 다시 확인예정)
-. 내가 참고하는 자료에는 def 를 사용하는 함수 정의법은 리터럴 표기법이라고 하는데
이 부분은 리터럴(literal), 제네레이터(generator)를 묶어서 따로 공부 및 포스팅 예정
-. 먼저 lambda를 설명하기 전에 리터럴 표기법인 def를 사용해서 곱셈 함수 정의
<코드>
def multiple(x,y):
return x*y
print("함수 사용 결과:", multiple(10,20))
함수 사용 결과: 200
-. multiple이라는 이름을 가진 함수를 사용하고 print를 통해 호출해보았다. 이 것을 lambda 표현식으로 바꾸면 아래 한줄로 표기할 수 있다.
※ lamda 사용법
(lamda 매개변수 : 함수내용 (함수입력값)
<예시 코드>
lambda_test = (lambda x,y: x*y)(10,20)
print("lamda 계산식 결과", lambda_test)
lamda 계산식 결과 200
-. lambda x,y : x,y는 위에 multiple 함수에서 입력되는 매개변수 x,y와 동일하다.
-. x*y : 실제 함수의 내용, multiple 함수에서 return 되는 부분
2. map
-. map은 리스트나 튜플과 같은 반복 자료형을 처리해줄 수 있는 함수이다.
-. map 함수에 lambda 를 사용해서에 리스트(or 튜플)의 각 요소에 함수를 적용할 수 있음
-. map 함수는 이터레이터(iterator)라고 한다. 이터레이터는 값을 차례대로 꺼낼 수 있는 객체이다.
(반복 가능한 객체라고 하면 리스트, 튜플등의 자료형도 해당 됨)
<예시 코드>
#map 함수를 사용하기 위한 리스트 정의
test_list = [1,2,3,4,5]
#map(리스트에 lambda 함수 적용하기)
test_map1 = map(lambda x : x*2, test_list)
print(test_map1)
print("list 사용 :", list(test_map1))
#map(range 통해 lambda 함수 적용하기)
test_map2 = map(lambda x : x**2, range(10))
print(test_map2)
print("range 사용 :", list(test_map2))
<map object at 0x000002994F284B08>
list 사용 : [2, 4, 6, 8, 10]
<map object at 0x000002994F284DC8>
range 사용 : [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
-. map 함수 ( ) 내부에 lambda 함수를 똑같이 사용. 대신 자료형은 리스트, 튜플 등 반복적인 자료형으로 입력 가능
-. map함수의 결과를 확인하려면 반드시 list, tuple 등의 자료형 형태로 변환해주어야 함.
3. filter
-. map과 같이 반복 자료형을 처리해줄 수 있음.
-. filter 이름 그대로 조건에 맞는 데이터룰 필터링하여 다른 자료형으로 만들 때 사용
-. 아래 예시 코드를 보고 이해해보자.
<예시 코드>
##map, filter 함수 실습1
test_list = [1,2,3,4,5]
test_filter = filter(lambda x : x<3, test_list)
test_map = map(lambda x : x<3, test_list)
print("filter 사용시 : ", list(test_filter))
print("map 사용시 : ", list(test_map))
filter 사용시 : [1, 2]
map 사용시 : [True, True, False, False, False]
-. 위 결과에서 보면 알겠지만 filter는 조건에 맞는 자료만 추려 다른 자료형으로 반환한다.
-. map은 조건에 맞는지 True or False로 판단한 결과를 출력한다.
-. 참고로 map과 filter는 문자열에도 적용할 수 있다. 파이썬에서는 문자열도 한자씩 반복이 가능하다.
아래 예시 코드를 보자.
<예시 코드>
##map, filter 문자열 적용
test_str = "ABCDE"
test_map = map(lambda x : x.lower(), test_str)
test_filter = filter(lambda x : x.lower(), test_str
print("문자열 filter :", list(test_map))
print("문자열 map :", list(test_filter))
문자열 filter : ['a', 'b', 'c', 'd', 'e']
문자열 map : ['A', 'B', 'C', 'D', 'E']
-. lower( )함수의 경우 문자열 처리 함수로 영문 대문자를 소문자로 변경하여 준다.
-. 결과에서 보면 알겠지만 문자열을 개별적으로 분리하여 자료형으로 반환하였다.(위 코드는 리스트로)
4. List comprehension
-. 리스트를 쉽게 이해할 수 있도록, 한 줄로 표현 한 파이썬의 문법 형식
-. 기존 리스트를 기반으로 새로운 리스트를 만들어내는 구문
-. 위에서 map, filter를 통해 리스트화시켰던 부분들은 리스트 컴프리헨션 구문으로 모두 표현가능하다.
(map, filter를 사용하는 것보다 가독성이 높아 파이썬다운 코드라고 한다.)
-. 파이썬의 2.7 버전 이후에는 리스트 외에도 딕셔너리 등도 컴프리헨션 구문 표현이 가능하다.
(아래 예시에선 다루진 않는다.)
※ 리스트 컴프리헨션 구문 사용법
[ 수식 for 변수 in 리스트명 ]
아래는 리스트의 각 숫자들을 *2하는 for 반복문이다.
<코드>
##no list comprehesion : for loop
test_list=[1,2,3,4,5]
result = []
for i in test_list:
result.append(i*2)
print("for loop:",result)
for loop: [2, 4, 6, 8, 10]
1) 위 코드를 리스트 컴프리헨션 구문으로 바꿀경우 예시
<코드>
test_list = [1,2,3,4,5]
##list comprehension
lc = [x*2 for x in test_list]
for loop: [2, 4, 6, 8, 10]
2) list의 요소가 문자열인 경우 예시
<코드>
test_list = ['AB','Cd','Ef','GG','GASDF']
##문자열 list comprehension(모두 소문자로 바꿔 리스트화하기)
test_str = [x.lower() for x in test_list]
print("결과:", test_str)
결과: ['ab', 'cd', 'ef', 'gg', 'gasdf']
3) list가 아닌 문자열인 경우에도 아래와 같이 컴프리헨션 구문 사용 가능
-. 결과는 리스트로 출력된다.
<코드>
word = 'ABCDEFGH'
double_word = [i * 3 for i in word]
print("결과:", double_word)
결과: ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF', 'GGG', 'HHH']
4) 리스트 컴프리헨션에 조건을 달경우(filter와 동일)
-. 짝수인 경우만 추려 다시 리스트로 만드는 구문이다.
<코드>
test_list = [1,2,3,4,5,6,7,8,9,10]
#list comprehension -filter
lc_test = [i for i in test_list if i % 2 == 0]
print("결과:", lc_test)
결과: [2, 4, 6, 8, 10]
5) 조건이 2개이상 있을 경우
-. 표현식1 : if문 2개 사용, 가독성을 위해 2번째 조건문을 다음줄로 넘김.
<코드>
test_list = [1,2,3,4,5,6,7,8,9,10]
test_lc2 = [i for i in range(0,11) if i % 2 == 0
if i % 5 == 0]
print("결과:", test_lc2)
결과: [0, 10]
-. 표현식2 : and 사용
<코드>
test_list = [1,2,3,4,5,6,7,8,9,10]
test_lc3 = [i for i in range(0,11) if i % 2 == 0 and i % 5 == 0]
print("결과:", test_lc3)
결과: [0, 10]
참고링크
1. 리스트 컴프리헨션 : shoark7.github.io/programming/python/about-list-comprehension-python
2. 람다 함수 : wikidocs.net/22804
'코딩 > Algorithm, 자료구조' 카테고리의 다른 글
[Python/파이썬] 자료구조 - 링크드리스트(Linked List) 1 (2) | 2021.05.31 |
---|---|
[Python/파이썬] 자료구조 - 큐(Queue)와 스택(Stack) (1) | 2021.05.24 |
[Python/파이썬] 자료구조 - 배열(Array) (0) | 2021.05.23 |
[Python/파이썬] 문자열 처리 - Palindrom(팰린드롬) (0) | 2021.05.15 |
[Python/파이썬]Indent, Naming, Type hint (1) | 2021.05.02 |